【发布时间】:2011-09-12 18:58:15
【问题描述】:
我必须编写一个 C# API 来注册全局热键。为了接收 WM_HOTKEY 消息,我使用System.Windows.Forms.NativeWindow 并使用System.Windows.Forms.Application.Run(ApplicationContext) 运行自己的消息循环。当用户想要注册一个热键时,他必须运行一个名为RegisterHotkey() 的方法,该方法用System.Windows.Forms.ApplicationContext.ExitThread() 停止消息循环,用RegisterHotKey() (P/Invoke) 函数注册热键并再次启动消息循环。这是必需的,因为必须在创建窗口的同一线程中调用 RegisterHotKey(),而必须在运行消息循环的同一线程中再次实例化该窗口。
问题是,如果用户在启动运行消息循环的线程后不久调用RegisterHotkey() 方法,ApplicationContext.ExitThread() 会在Application.Run(ApplicationContext) 之前被调用,因此应用程序会无限期地阻塞。有人知道等待消息循环启动的方法吗?
提前致谢!
【问题讨论】:
-
这没有多大意义。只需在 开始消息循环之前调用 RegisterHotkey()。另外,需要一个真实的窗口,你必须有一个有效的句柄。
-
由于我不想为每个热键启动一个消息循环,我必须停止并重新启动现有的循环以在同一线程中调用 RegisterHotKey()。而且由于我的代码正在运行,我认为我不需要一个真正的窗口,而是由
NativeWindow.CreateHandle(CreateParams)创建有效句柄。
标签: c# .net winforms multithreading message-loop