我正在编写一个小型辅助功能应用程序,它模拟某些键盘手势,例如音量增大\减小。
目标是发送一个命令。
在实践中,音量一直高达100%,就好像用户按下了一个按钮几秒钟,或者好像消息被发送了多次。
在C和C#(使用PInvoke(中,这种行为与PostMessage
和SendMessage
相同
C:
PostMessage(0xffff, 0x0319, 0, 0xa0000)
C#:
PostMessage(new IntPtr(0xffff), WindowMessage.WM_APPCOMMAND, (void*)0, (void*)0xa0000);
参数的含义:发送到所有窗口,消息,无来源,音量增大
问题:如何发出命令,使Windows以最小增量调整音量
此外,我尝试使用WP_KEYUP和WP_KEYDOWN,但没有成功
// dispatch to all apps, message, wparam: virtual key, lparam: repeat count = 1
User32.PostMessage(new IntPtr(0xffff), User32.WindowMessage.WM_KEYDOWN, new IntPtr(0xaf000), new IntPtr(1));
User32.PostMessage(new IntPtr(0xffff), User32.WindowMessage.WM_KEYUP, new IntPtr(0xaf000), new IntPtr(1));
命令被多次发送的原因是,正如Hans在评论中指出的,我使用0xffff
作为第一个参数将其广播到所有窗口。每个窗口都通过增加音量来处理它。
发送多条消息的解决方案是将消息发送到任一
- 外壳句柄
GetShellWindow()
- 前台窗口句柄
GetForegroundWindow()
两个手柄都将音量调节了一个档位。GetDesktopWindow()
没有起作用。