1、WndProc和defWndProc的区别是什么?
都是在PreProcessMessage后调用的么?
请细说cadn说有人说的让我不明白:(我不知道他们具体的区别和用途是什么)WndProc窗口过程函数,可自行写里面的代码, 
DefWndProc默认的窗口过程函数
2、我重载了窗口a的defWndProc方法,当捕捉其他程序窗口b的鼠标消息时,让消息显示在a窗口的textbox中
可是发现一旦捕捉到的时候,a窗口会假死一阵子,这是什么原因?(我用一个钩子dll捕抓b的消息然后 postmessage给a)
代码如下//warhandle 是b的句柄
//mainhandle是a的句柄
LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code > -1)
{
MSG *pMsg = (MSG*)lParam;
if(NULL != warhandle && pMsg->hwnd==warhandle)
{
//SendMessage((HWND)mainhandle,WM_USER+101,wParam,lParam);
PostMessage((HWND)mainhandle,WM_USER+101,wParam,lParam);
}
}
return CallNextHookEx(warHook,code,wParam,lParam);
}
protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_TEST:
                    textBox1.Text += "窗口句柄:" + m.HWnd.ToString("X");
                    break;                default:
                    base.DefWndProc(ref m);
                    break;
            }
}

解决方案 »

  1.   

    WndProc
    DefWndProc
    偶也不是很清楚区别,在一个form中,WndProc先执行,都可以重载,截获消息以前也发过消息,没发现过假死,是否和频繁发消息有关
      

  2.   

    对于捕获鼠标的消息,一般都要使用完以后释放一次
    搂主调用一下下面的API看看:
    [DllImport("user32.dll")]
    public static extern int ReleaseCapture();也就是改成:
    protected override void DefWndProc(ref System.Windows.Forms.Message m)
    {
                switch (m.Msg)
                {
                    case WM_TEST:
                        textBox1.Text += "窗口句柄:" + m.HWnd.ToString("X");
                        ReleaseCapture();
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
    }
      

  3.   

    to  net5i  :
    试了一下 不是你说的问题
      

  4.   

    不知道搂主得WM_USER+101消息是不是和某个控件的消息冲突了?不妨改成WM_USER+1001看看
      

  5.   

    to net5i :也不是这个问题 可能真的是消息发送过于频繁…… 但是没法求证
      

  6.   

    也不是这个问题 可能真的是消息发送过于频繁…… 但是没法求证应该好求证的,搂主有下面一句:
    textBox1.Text += "窗口句柄:" + m.HWnd.ToString("X"); 第一条消息处理完毕后,搂主不妨看看textBox1框里面有多少个“窗口句柄”四个字
    如果很多,那么就是太频繁。我感觉是太频繁,因为下面if大多情况下是成立的:
    if(NULL != warhandle && pMsg->hwnd==warhandle)