Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32中的多个WndProc函数_C++_Winapi - Fatal编程技术网

C++ Win32中的多个WndProc函数

C++ Win32中的多个WndProc函数,c++,winapi,C++,Winapi,这可能是一个愚蠢的问题,但能否在Win32中注册多个WndProc函数?e、 g.框架捕获一些消息,而我的应用程序对其他消息感兴趣-如何在不修改框架代码的情况下捕获这些消息?如果我正确理解您的意图,您可以通过以下方式来实现。假设您知道要钩住其消息循环的线程,您可以按照以下方式执行操作(未选中): 您可以使用函数CallWindowProc而不是DefWindowProc来链接多个消息处理函数 以下是一个例子: pfOriginalProc = SetWindowLong( hwnd, GWL_W

这可能是一个愚蠢的问题,但能否在Win32中注册多个WndProc函数?e、 g.框架捕获一些消息,而我的应用程序对其他消息感兴趣-如何在不修改框架代码的情况下捕获这些消息?

如果我正确理解您的意图,您可以通过以下方式来实现。假设您知道要钩住其消息循环的线程,您可以按照以下方式执行操作(未选中):


您可以使用函数
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 );
    }
}

阅读Windows API“窗口子类化”,你应该使你的问题足够具体,可以回答。e、 g.不要说“框架”,而是说出你正在处理的问题。比如“对其他人感兴趣”,说出他们的名字。等等,它是混凝土的。框架在一个黑盒子中实现了主消息处理程序,但我想捕获其他消息。哪一个框架是不相关的。幸运的是,我的小人物不会在别人不会对他们的每一个建议卑躬屈膝时大发雷霆。有人能给出一个很好的答案,所以你的论点是错误的。有时候,当你不能理解一个问题时,这意味着你不够聪明,而不是这个问题不好。我怀疑你是否会谦虚地承认这样的观点。许多框架都提供了这种能力。例如,MFC有消息映射。检查您的框架文档。
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 );
    }
}