【问题标题】:Getting control of the main thread in windows c++ app在 Windows C++ 应用程序中控制主线程
【发布时间】: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 :)

【问题讨论】:

    标签: c++ windows


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 2011-04-09
        相关资源
        最近更新 更多