win32 PostMessage WM_APPCOMMAND 发送多条消息而不是一条

win32 PostMessage WM_APPCOMMAND sends multiple messages instead of one

我正在编写一个小型辅助功能应用程序,它模拟某些键盘手势,例如音量 up\down。

目标是发送单个命令。

实际上,音量会一直调到 100%,就好像用户按下一个按钮几秒钟,或者好像消息被发送了多次。

此行为与 PostMessageSendMessage 相同,在 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 通过将音量增加一个档次来处理它。

发送多条消息的解决方案是将消息发送到

  1. shell句柄GetShellWindow()
  2. 前台window句柄GetForegroundWindow()

两个手柄都将音量调了一个档次。 GetDesktopWindow() 不过没用。