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

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

我正在编写一个小的辅助功能应用程序,它模拟某些键盘手势,如音量增大\减小

目标是发送单个命令

在实践中,音量一直高达100%,就好像用户按下按钮几秒钟或者消息被发送了多次

此行为与C和C中的
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
作为第一个参数将其广播到所有窗口。每个窗口都通过将音量增加一个槽口来处理它

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

  • shell句柄
    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));