为什么WM_APPCOMMAND LPARAM必须乘以65536

Noi*_*art 3 winapi

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

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
Run Code Online (Sandbox Code Playgroud)

为什么我要乘以65,536?文档没有说明这一点.如果我不繁殖,那么它不起作用.

Soo*_*nts 8

对于WM_APPCOMMAND,该lParam参数将三个值打包在一个整数中.

较低的16位字,dwKeys表示各种虚拟键是否已关闭.

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

乘以65536与向左移位16位相同(因为65536 =十六进制的0x10000).因此,当您发送消息时APPCOMMAND_VOLUME_UP * 65536,您指定的cmdAPPCOMMAND_VOLUME_UP,并且uDevicedwKeys都是零.