为啥 WM_APPCOMMAND LPARAM 必须乘以 65536

Posted

技术标签:

【中文标题】为啥 WM_APPCOMMAND LPARAM 必须乘以 65536【英文标题】:Why do WM_APPCOMMAND LPARAM have to be multiplied by 65536为什么 WM_APPCOMMAND LPARAM 必须乘以 65536 【发布时间】:2016-11-13 19:06:14 【问题描述】:

我正在尝试控制主音量。我能够成功地做到这一点:

HWND mainhwnd = CreateWindow(szWindowClass, _T("window-noit-ext-profilist"), 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, wcex.hInstance, NULL);
if (!mainhwnd) 
    MessageBox(NULL, _T("Profilist: Call to CreateWindow failed!"), _T("window-noit-ext-profilist"), NULL);
    return 1;



SendMessage(mainhwnd, WM_APPCOMMAND, (WPARAM)mainhwnd, (LPARAM)(APPCOMMAND_VOLUME_MUTE * 65536)); // mute

SendMessage(mainhwnd, WM_APPCOMMAND, (WPARAM)mainhwnd, (LPARAM)(APPCOMMAND_VOLUME_DOWN * 65536)); // vol down

SendMessage(mainhwnd, WM_APPCOMMAND, (WPARAM)mainhwnd, (LPARAM)(APPCOMMAND_VOLUME_UP * 65536)); // vol up

为什么我必须乘以 65,536?文档没有说明这一点。如果我不乘,那么它就不起作用。

【问题讨论】:

从源中读取宏 【参考方案1】:

对于 WM_APPCOMMAND,lParam 参数 packs three values 在单个整数中。

低16位字dwKeys,表示各种虚拟键是否down。

较高的 16 位字包含两个字段:最高 4 位,uDevice,指定生成输入事件的输入设备。低 12 位 cmd 包含应用程序命令。

乘以 65536 与向左移位 16 位相同(因为 65536 = 十六进制的 0x10000)。因此,当您使用APPCOMMAND_VOLUME_UP * 65536 发送消息时,您指定cmdAPPCOMMAND_VOLUME_UP,而uDevicedwKeys 均为零。

【讨论】:

以上是关于为啥 WM_APPCOMMAND LPARAM 必须乘以 65536的主要内容,如果未能解决你的问题,请参考以下文章

WPARAM和LPARAM的含义

这个MFC程序为啥无法显示窗口?

如何创建 SendMessage WM_KEYDOWN 的 lParam

为啥mysql解释说'使用索引'而使用的索引不包含必填字段

c语言里的LPARAM类型对应的c#里是啥类型呢? LPARAM到底是怎么样的一个类型啊?

wParam与lParam的区别