【问题标题】:Multiple WndProc functions in Win32Win32 中的多个 WndProc 函数
【发布时间】:2012-11-01 12:10:38
【问题描述】:

这可能是个愚蠢的问题,但你能在 Win32 中注册多个 WndProc 函数吗?例如框架捕获了一些消息,而我的应用对其他消息感兴趣 - 如何在不修改框架代码的情况下捕获它们?

【问题讨论】:

  • 阅读 Windows API“窗口子类化”
  • 您应该使您的问题足够具体,以便可以回答。例如而不是“框架”,命名您正在处理的内容。而不是“对其他人感兴趣”,说出他们的名字。以此类推。
  • 它是具体的。框架在黑盒内实现主消息处理程序,但我想捕获其他消息。哪个框架无关紧要。
  • 幸运的是,当有人不向他们的每一个建议磕头时,我的小人不会跑。有人能够给出一个很好的答案,所以你的论点被证明是错误的。有时当你无法理解一个问题时,这意味着你不够聪明,而不是问题不好。不过,我怀疑你会谦虚到承认这种观点。
  • 许多框架都提供了这种能力。例如,MFC 有消息映射。检查您的框架文档。

标签: c++ winapi


【解决方案1】:

如果我正确理解您的意图,您可以通过setting a hook 进行操作。假设您知道要挂接其消息循环的线程,您可以按照以下方式执行某些操作(未选中):

SetWindowsHookEx(WH_CALLWNDPROC, yourHOOKPROC, NULL, theThreadId);

【讨论】:

    【解决方案2】:

    您可以使用函数CallWindowProc 而不是DefWindowProc 来链接多个消息处理函数。

    这是一个例子:

    pfOriginalProc = SetWindowLong( hwnd, GWL_WNDPROC, (long) wndproc1 );    // First WNDPROC
    
    pfOriginalProc2 = SetWindowLong( hwnd, GWL_WNDPROC, (long) wndproc2);   // Second WNDPROC, WILL EXECUTE FIRST!!
    
    
    LRESULT wndproc1( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
        switch ( uMsg )
        {
          ...
          default:
             return CallWindowProc( pfOriginalProc, hwnd, uMsg, wParam, lParam );
        }
    
    
    }
    
    
    LRESULT wndproc2( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    
        switch ( uMsg )
        {
            ...
            default:
                return CallWindowProc( pfOriginalProc2, hwnd, uMsg, wParam, lParam );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2013-09-02
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多