win32 PostMessage WM_APPCOMMAND отправляет несколько сообщений вместо одного - PullRequest
0 голосов
/ 07 ноября 2018

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

Цель - отправить одну команду.

На практике громкость увеличивается до 100%, как если бы пользователь нажимал кнопку в течение пары секунд или как если бы сообщение отправлялось несколько раз.

Это поведение одинаково с PostMessage и SendMessage, как в C, так и в C # (с использованием PInvoke)

С:

PostMessage(0xffff, 0x0319, 0, 0xa0000)

C #:

PostMessage(new IntPtr(0xffff), WindowMessage.WM_APPCOMMAND, (void*)0, (void*)0xa0000);

Значение параметров: отправка всем окнам, сообщение без источника, увеличение громкости

Вопрос: Как выполнить команду, которая приведет к тому, что 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));

1 Ответ

0 голосов
/ 08 ноября 2018

Причина, по которой команда отправляется несколько раз, заключается в том, что, как указал Ганс в комментарии, я транслировал ее всем окнам, используя 0xffff в качестве первого параметра. Каждое окно обрабатывает его, увеличивая громкость на ступеньку.

Решением для отправки нескольких сообщений является отправка сообщения либо на

  1. Оболочка ручки GetShellWindow()
  2. Ручка окна переднего плана GetForegroundWindow()

Обе ручки регулировали громкость на одну ступень. GetDesktopWindow() не сработало.

...