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;
}
}
都是在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;
}
}
DefWndProc
偶也不是很清楚区别,在一个form中,WndProc先执行,都可以重载,截获消息以前也发过消息,没发现过假死,是否和频繁发消息有关
搂主调用一下下面的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;
}
}
试了一下 不是你说的问题
textBox1.Text += "窗口句柄:" + m.HWnd.ToString("X"); 第一条消息处理完毕后,搂主不妨看看textBox1框里面有多少个“窗口句柄”四个字
如果很多,那么就是太频繁。我感觉是太频繁,因为下面if大多情况下是成立的:
if(NULL != warhandle && pMsg->hwnd==warhandle)