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

时间:2018-11-07 16:27:29

标签: winapi pinvoke keyboard-events

我正在编写一个小型辅助功能应用程序,该应用程序可模拟某些键盘手势,例如提高音量或降低音量。

目标是发送单个命令。

实际上,音量一直上升到100%,就像用户按下按钮几秒钟或好像多次发送邮件一样。

在C和C#中(使用PInvoke),PostMessageSendMessage的行为相同。

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));

1 个答案:

答案 0 :(得分:0)

多次发送命令的原因是,正如汉斯在评论中指出的那样,我将0xffff作为第一个参数将其广播到了所有窗口。每个窗口通过增加一个缺口来处理它。

发送多条消息的解决方案是将消息发送给任一方

  1. shell句柄GetShellWindow()
  2. 前景窗口句柄GetForegroundWindow()

两个手柄均将音量调节了一个档次。 GetDesktopWindow()无效。