Я работал над приложением 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