Так что RegisterHotKey
необходимо вызывать из того же потока, который создал окно и запустил цикл обработки сообщений.Почему бы не внедрить выполнение RegisterHotKey
в пользовательскую цепочку сообщений?Таким образом, вам не нужно останавливать и перезапускать цикл сообщений.Вы можете просто использовать первый, который вы начали, и одновременно избежать странных условий гонки.
Вы можете внедрить делегат в другой поток, используя ISynchronizeInvoke.Invoke
, который будет маршалировать этот делегат в поток, в котором находится * 1006.* пример.Вот как это можно сделать.
void Main()
{
var f = new Form();
// Start your custom message loop here.
new Thread(
() =>
{
var nw = NativeWindow.FromHandle(f.Handle);
Application.Run(new ApplicationContext(f));
}
// This can be called from any thread.
f.Invoke(
(Action)(() =>
{
RegisterHotKey(/*...*/);
}), null);
}
Я не знаю ... может быть, вы захотите также позвонить UnregisterHotKey
в зависимости от того, какое поведение вы преследуете.Я не очень знаком с этими API, поэтому я не могу комментировать, как они могут быть использованы.
Если вы не хотите, чтобы этот произвольный экземпляр Form
создавался, то, возможно, вам не удастся отправить собственное сообщение впропустите через SendMessage
и т. п. и обработайте его в NativeWindow.WndProc
, чтобы получить тот же эффект, который обеспечивают методы ISynchronizeInvoke
автоматически.