Winapi win32 PostMessage WM_APPCOMMAND发送多条消息,而不是一条
我正在编写一个小的辅助功能应用程序,它模拟某些键盘手势,如音量增大\减小 目标是发送单个命令 在实践中,音量一直高达100%,就好像用户按下按钮几秒钟或者消息被发送了多次 此行为与C和C中的Winapi win32 PostMessage WM_APPCOMMAND发送多条消息,而不是一条,winapi,pinvoke,keyboard-events,Winapi,Pinvoke,Keyboard Events,我正在编写一个小的辅助功能应用程序,它模拟某些键盘手势,如音量增大\减小 目标是发送单个命令 在实践中,音量一直高达100%,就好像用户按下按钮几秒钟或者消息被发送了多次 此行为与C和C中的PostMessage和SendMessage相同(使用PInvoke) C: C#: 参数的含义:发送到所有窗口、消息、无源、音量增大 问题:如何发出命令,使Windows以最小增量调整音量? 此外,我尝试使用WP_KEYUP和WP_KEYDOWN,但没有成功 // dispatch to all app
PostMessage
和SendMessage
相同(使用PInvoke)
C:
C#:
参数的含义:发送到所有窗口、消息、无源、音量增大
问题:如何发出命令,使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()不起作用。“发送到所有窗口”是个坏主意。他们每个人都会尝试提高音量,最终达到100%几乎是有保证的。一个窗口就够了。如果您没有自己的,请使用GetDesktopWindow()。或者使用聚焦窗口。谢谢!
GetShellWindow()
和GetForegroundWindow()
都是有效的。如果您不打算让任何人阅读此代码,请使用符号常量代替幻数HWND\u广播
随时可用。同样,它比0x0319
更具意义。参数也是如此:APPCOMMAND\u VOLUME\u UP
(加上位移位)比0xa0000
更有意义。
PostMessage(new IntPtr(0xffff), WindowMessage.WM_APPCOMMAND, (void*)0, (void*)0xa0000);
// 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));