win32 PostMessage WM_APPCOMMAND 发送多条消息而不是一条
win32 PostMessage WM_APPCOMMAND sends multiple messages instead of one
我正在编写一个小型辅助功能应用程序,它模拟某些键盘手势,例如音量 up\down。
目标是发送单个命令。
实际上,音量会一直调到 100%,就好像用户按下一个按钮几秒钟,或者好像消息被发送了多次。
此行为与 PostMessage
和 SendMessage
相同,在 C 和 C# 中(使用 PInvoke)
C:
PostMessage(0xffff, 0x0319, 0, 0xa0000)
C#:
PostMessage(new IntPtr(0xffff), WindowMessage.WM_APPCOMMAND, (void*)0, (void*)0xa0000);
参数含义:发送给所有人windows,消息,无来源,音量加大
问题:如何发出一条命令,使 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
作为第一个参数将它广播给所有 windows。每个 window 通过将音量增加一个档次来处理它。
发送多条消息的解决方案是将消息发送到
- shell句柄
GetShellWindow()
- 前台window句柄
GetForegroundWindow()
两个手柄都将音量调了一个档次。 GetDesktopWindow()
不过没用。
我正在编写一个小型辅助功能应用程序,它模拟某些键盘手势,例如音量 up\down。
目标是发送单个命令。
实际上,音量会一直调到 100%,就好像用户按下一个按钮几秒钟,或者好像消息被发送了多次。
此行为与 PostMessage
和 SendMessage
相同,在 C 和 C# 中(使用 PInvoke)
C:
PostMessage(0xffff, 0x0319, 0, 0xa0000)
C#:
PostMessage(new IntPtr(0xffff), WindowMessage.WM_APPCOMMAND, (void*)0, (void*)0xa0000);
参数含义:发送给所有人windows,消息,无来源,音量加大
问题:如何发出一条命令,使 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
作为第一个参数将它广播给所有 windows。每个 window 通过将音量增加一个档次来处理它。
发送多条消息的解决方案是将消息发送到
- shell句柄
GetShellWindow()
- 前台window句柄
GetForegroundWindow()
两个手柄都将音量调了一个档次。 GetDesktopWindow()
不过没用。