Значение APPCOMMAND_VOLUME_UP и APPCOMMAND_VOLUME_DOWN действительно имеет значение, если оно начинается с 0xA и 0x9?

Я использую приведенный ниже код для программного изменения объема системы. Я был бы честен с вами, что я получил один и тот же код из Интернета из многих источников.

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

Я заметил, что значения двух переменных APPCOMMAND_VOLUME_UP и APPCOMMAND_VOLUME_DOWN на самом деле не имеют значения, если значение up начинается с 0xA, а значение down начинается с 0x9. Я пробовал много разных значений между 0000 и FFFF для сценариев ВВЕРХ и ВНИЗ. Правда ли, что значения не имеют значения?

У меня нет особых знаний о вызовах взаимодействия. Может кто-нибудь объяснить, пожалуйста, значение этих ценностей?

Заранее спасибо!

1 ответ

Решение

Здесь нет "ценности". Аргумент LPARAM кодирует три различных свойства:

  • Команда, например APPCOMMAND_VOLUME_UP, имеет значение 10 (0x0A).
  • Устройство указывает, как была сгенерирована команда, и может быть клавишей, мышью или oem.
  • "Ключи" указывают, какие модификаторы действовали при создании команды. Как shift/ctrl для клавиатуры и нажатая кнопка мыши для мыши

Эти три свойства кодируются так, как битовые поля работают на языке Си. Битовая комбинация в шестнадцатеричном формате - 0xDCCCKKKK, где C - команда, D - устройство, K - ключи.

Поскольку вы сами синтезируете сообщение, у вас нет никакого осмысленного способа сообщить об устройстве или ключах. Не имеет значения, вы должны просто использовать 0 (устройство = клавиатура, без клавиш-модификаторов). Обратите внимание, что значение, которое вы используете сейчас, не является правильным, 0xAFFFF не использует правильное значение ключей, и вы говорите, что клавиши CTRL и SHIFT не работают. Возможно, этого недостаточно, чтобы окончательно запутать оболочку, эти клавиши-модификаторы не влияют на работу конкретной команды.

Таким образом, разумная реализация будет выглядеть так:

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);
}
Другие вопросы по тегам