2016-01-19 24 views
0

Я использую приведенный ниже код для изменения системного объема программным путем. Я был бы честен с вами, что получил тот же код из Интернета от lot ofsources.Действительно ли значение 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 на самом деле не имеет значения, пока вверх значение начинается с 0xA и вниз значение начинается с 0x9. Я пробовал много разных значений между 0000 и FFFF для сценариев UP и DOWN. Правда ли, что ценности не имеют значения?

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

Спасибо заранее!

+0

См https://msdn.microsoft.com/en-us/library/windows/desktop/ms646275%28v=vs.85%29.aspx – stuartd

ответ

3

Нет «значения». Аргумент LPARAM кодирует три различных свойства:

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

Эти три свойства закодированы так, как битовые поля работают на языке C. Битовая диаграмма в шестнадцатеричном формате равна 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); 
} 
+0

Спасибо за четкое объяснение. Я понял это сейчас. –

+0

У меня есть еще один вопрос, связанный с этим. Являются ли эти команды жесткими для увеличения/уменьшения громкости на значение 2? Я вижу, что объем увеличивается на 2 уровня при увеличении и уменьшается на 2 при уменьшении? То же самое происходит и с моими клавишами громкости ноутбука. ---- Дайте мне знать, если мне нужно опубликовать это как отдельный вопрос. –

+0

Отправка тоже вопрос. http://stackoverflow.com/q/34899533/2377928 –