在 Windows C++ 应用程序中控制主线程
Posted
技术标签:
【中文标题】在 Windows C++ 应用程序中控制主线程【英文标题】:Getting control of the main thread in windows c++ app 【发布时间】:2008-12-05 18:18:35 【问题描述】:我正在编写一些代码,希望能够与任何窗口一起工作,例如通过 windows API、MFC、wxWidgets 等创建的窗口。
问题在于,对于某些事情,我需要使用创建窗口的同一线程,在许多情况下,它只是处于消息循环中。
我的第一个想法是将回调消息发布到窗口,然后当它使用其中一个参数和某种函数指针接收消息时,它将在我的代码中调用一个函数。但是似乎没有标准的 Windows 消息来执行此操作,并且我无法创建自己的消息,因为我不控制 Windows 代码,因此无法将所需的代码添加到消息处理程序以实现回调...
还有其他方法可以让创建窗口的线程进入我的函数吗?
编辑: 约翰 Z sugested 我迷上了 windows 消息。如果我这样做,是否有某种方法可以获取自定义消息的“ID”,而不会与窗口已有的任何自定义消息发生冲突?
我可能会这样做
WM_CALLBACK = WM_APP+1
但是如果我挂接的窗口已经使用 WM_APP+1 做了一些事情,我会遇到问题。
编辑2: 刚刚找到 RegisterWindowMessage :)
【问题讨论】:
【参考方案1】:如果你和窗口在同一个进程中,你可以通过子类化它来钩住它的消息。查看http://msdn.microsoft.com/en-us/library/ms633570(VS.85).aspx
关键 API 是 SetWindowLong。
// Subclass the edit control.
wpOrigEditProc = (WNDPROC) SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)EditSubclassProc);
// Remove the subclass from the edit control.
SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)wpOrigEditProc);
【讨论】:
【参考方案2】:除了子类化之外,您还可以使用SetTimer 在窗口线程中调用函数。
VOID CALLBACK Function(
HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
// stuff
SetTimer(hWnd, event, 0, Function);
【讨论】:
以上是关于在 Windows C++ 应用程序中控制主线程的主要内容,如果未能解决你的问题,请参考以下文章