在 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++ 应用程序中控制主线程的主要内容,如果未能解决你的问题,请参考以下文章

C++多线程记录1

Windows C++:优先处理线程以防止主线程被抢占

在 Windows 操作系统的情况下,如何将数据从 OpenCV 或 C++ 线程函数返回到主线程?

C++控制台程序怎样使主函数无限循环

C++ Windows 套接字 - 在程序退出时关闭套接字

C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组