我必须编写一个用于注册全局热键的C#API。要接收WM_HOTKEY消息,我使用System.Windows.Forms.NativeWindow
并与System.Windows.Forms.Application.Run(ApplicationContext)
一起运行自己的消息循环。当用户想要注册一个热键时,他必须运行一个名为RegisterHotkey()
的方法,该方法用System.Windows.Forms.ApplicationContext.ExitThread()
停止消息循环,用RegisterHotKey()
(P/Invoke)函数注册热键并再次启动消息循环。这是必需的,因为RegisterHotKey()
必须在创建窗口的同一个线程中调用,而这个线程必须在运行消息循环的同一个线程中实例化。C# - 等待WinForms消息循环
问题是,如果用户在启动正在运行消息循环的线程后立即调用RegisterHotkey()
方法,ApplicationContext.ExitThread()
在Application.Run(ApplicationContext)
之前被调用,因此应用程序将无限期地阻塞。有没有人知道等待消息循环开始的方法?
在此先感谢!
这没有什么意义。只需在启动消息循环之前调用RegisterHotkey()*即可。而且,真正的窗口是必需的,你必须有一个有效的句柄。 –
由于我不想为每个热键启动一个消息循环,我必须停止并重新启动现有的以在同一个线程中调用RegisterHotKey()。由于我的代码工作,我不认为我需要一个真正的窗口,有效的句柄是由'NativeWindow.CreateHandle(CreateParams)'创建的。 –