APPCOMMAND_VOLUME_UP和APPCOMMAND_VOLUME_DOWN的价值真的重要吗,只要它从0xA和

本文关键字:VOLUME APPCOMMAND 0xA DOWN UP 真的 | 更新日期: 2023-09-27 18:31:02

我正在使用以下代码以编程方式修改系统音量。老实说,我从很多来源从互联网上获得了相同的代码。

    //private const int APPCOMMAND_VOLUME_UP = 0xA0000;
    private const int APPCOMMAND_VOLUME_UP = 0xAFFFF;
    private const int APPCOMMAND_VOLUME_DOWN = 0x90000;
    private const int WM_APPCOMMAND = 0x319;
    [DllImport("user32.dll")]
    public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg,
        IntPtr wParam, IntPtr lParam);
    private void btnVolumeUp_Click(object sender, RoutedEventArgs e)
    {
        SendMessageW(new WindowInteropHelper(this).Handle, WM_APPCOMMAND, new WindowInteropHelper(this).Handle,
            (IntPtr)APPCOMMAND_VOLUME_UP);
    }

我观察到,只要向上值以0xA开头,向下值以0x9开头,APPCOMMAND_VOLUME_UP和APPCOMMAND_VOLUME_DOWN两个变量的值就无关紧要。对于 UP 和 DOWN 场景,我已经尝试了 0000 和 FFFF 之间的许多不同值。价值观真的不重要吗?

我对互操作调用知之甚少。有人可以解释一下这些价值观的重要性吗?

提前谢谢你!

APPCOMMAND_VOLUME_UP和APPCOMMAND_VOLUME_DOWN的价值真的重要吗,只要它从0xA和

没有"值"。 LPARAM 参数对三个不同的属性进行编码:

  • 例如,命令 APPCOMMAND_VOLUME_UP 为 10 (0x0A)。
  • 设备指示命令的生成方式,可以是键、鼠标或 OEM。
  • "键"指示生成命令时哪些修饰符有效。 就像键盘的 shift/ctrl 和鼠标的点击鼠标按钮一样

这三个属性的编码方式与位域在 C 语言中的工作方式相同。 十六进制中的位模式是0xDCCCKKKK,其中C是命令,D是设备,K是键。

由于您自己合成消息,因此没有有意义的方法来报告设备或密钥。 也没关系,你应该简单地使用 0(设备 = 键盘,没有修饰键)。 请注意,您现在使用的值不正确,0xAFFFF没有使用正确的键值,您说 CTRL 和 SHIFT 键已关闭。 可能不足以最终混淆 shell,这些修饰键不会影响特定命令的工作方式。

因此,一个理智的实现如下所示:

public enum AppCommand {
    VolumeDown = 9
    VolumeUp = 10,
    // etc..
}
private void SendAppCommand(AppCommand cmd) {
    var hwnd = new WindowInteropHelper(this).Handle;
    SendMessageW(hwnd, WM_APPCOMMAND, hwnd, (int)cmd << 16);
}