Попытка понять, что на самом деле происходит в методе C # WinForms WndProc при обработке сообщений горячих клавиш - PullRequest
1 голос
/ 16 ноября 2011

Я работал над приложением C # WinForms, которое регистрирует несколько горячих клавиш, используя хорошо обсужденные методы GlobalAddAtom и RegisterHotKey PInvoke.Программа запускается в свернутом режиме и запускается в системном трее.Каждый раз, когда получено одно из сообщений горячей клавиши, программа записывает данные о том, какая клавиша была нажата, и передает ее другому объекту для обработки.Некоторое время это работало относительно хорошо, но время от времени наблюдается странное поведение.Такие вещи, как одно и то же сообщение, обработанные несколько раз, или некоторые сообщения вообще пропущены.

После добавления обширной регистрации я обнаружил, что если пользователь удерживает комбинацию горячих клавиш (например, Win + C) немного дольше, чем обычноили просто удерживал его, затем новые сообщения горячих клавиш получали в цикле сообщений до того, как завершилось обработка предыдущего сообщения.

Теперь, как я вижу, сообщение получено в потоке пользовательского интерфейса.(даже если он скрыт) и обрабатывается блокирующим вызовом экземпляра другого класса.Если это правда, то как другое сообщение может войти в ту же функцию, которая в данный момент обрабатывает первое сообщение?Именно здесь мое отсутствие понимания Win32 заставляет меня чесать голову.

Мне кажется, что второе сообщение получено в другом потоке.Но тогда, если это правда, то в какой экземпляр моего класса обработки он обращается?

Любая помощь в выяснении этого будет принята с благодарностью!

Вот упрощенный пример.Этот код ...

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case MultipleClipboardsDialog.WM_HOTKEY:
            HotKey hotKey = new HotKey(m.LParam);
            Log.Debug("About to process hot key " + hotKey.ToString());
            this.Processor.ProcessHotKey(hotKey);
            Log.Debug("Finished processing hot key " + hotKey.ToString());
            break;

        default:
            base.WndProc(ref m);
            break;
    }
}

... производит вывод, подобный этому.

About to process hot key Win + C
About to process hot key Win + C
About to process hot key Win + C
Finished processing hot key Win + C

1 Ответ

0 голосов
/ 16 ноября 2011

Сообщение, которое вы ищете, генерируется только после отпускания кнопки.Способ установки сообщений в Windows таков, что для каждого нажатия клавиши создается до трех сообщений.Запустите Spy ++ и посмотрите на Блокнот.Вы должны видеть сообщения, которые генерируются во время обычной работы Windows.

В результате вы получаете сообщения KeyDown, KeyPressed и KeyUp (или что-то подобное).Вы, вероятно, перехватываете одно или два из этих сообщений (обычные операции, и вы код вокруг этого).Возможно, вы захотите взглянуть на Ascii и Virtual Keys.

...