如何通过回调函数获得消息 一个鼠标的HOOK测试程序 代码如下 如何从回调函数中得到鼠标的信息
privateintMouseHookProc(intnCode,Int32wParam,IntPtrlParam){//如果正常运行并且用户要监听鼠标的消息if((nC...
private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
//如果正常运行并且用户要监听鼠标的消息
if ((nCode >= 0) && (OnMouseActivity != null))
{
MouseButtons button = MouseButtons.None;
int clickCount = 0;
switch (wParam)
{
case WM_LBUTTONDOWN:
button = MouseButtons.Left;
clickCount = 1;
break;
case WM_LBUTTONUP:
button = MouseButtons.Left;
clickCount = 1;
break;
case WM_LBUTTONDBLCLK:
button = MouseButtons.Left;
clickCount = 2;
break;
case WM_RBUTTONDOWN:
button = MouseButtons.Right;
clickCount = 1;
break;
case WM_RBUTTONUP:
button = MouseButtons.Right;
clickCount = 1;
break;
case WM_RBUTTONDBLCLK:
button = MouseButtons.Right;
clickCount = 2;
break;
}
//从回调函数中得到鼠标的信息
MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0);
OnMouseActivity(this, e);
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
} 展开
{
//如果正常运行并且用户要监听鼠标的消息
if ((nCode >= 0) && (OnMouseActivity != null))
{
MouseButtons button = MouseButtons.None;
int clickCount = 0;
switch (wParam)
{
case WM_LBUTTONDOWN:
button = MouseButtons.Left;
clickCount = 1;
break;
case WM_LBUTTONUP:
button = MouseButtons.Left;
clickCount = 1;
break;
case WM_LBUTTONDBLCLK:
button = MouseButtons.Left;
clickCount = 2;
break;
case WM_RBUTTONDOWN:
button = MouseButtons.Right;
clickCount = 1;
break;
case WM_RBUTTONUP:
button = MouseButtons.Right;
clickCount = 1;
break;
case WM_RBUTTONDBLCLK:
button = MouseButtons.Right;
clickCount = 2;
break;
}
//从回调函数中得到鼠标的信息
MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
MouseEventArgs e = new MouseEventArgs(button, clickCount, MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y, 0);
OnMouseActivity(this, e);
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
} 展开
1个回答
展开全部
你需要截获 按钮 HWND 的 WM_LBUTTONDOWN 函数。
好几种方法实现。
比较简单的一种:
采用SetWindowLong子类化该HWND,即设置该窗口的消息处理函数,然后判断消息是不是按钮被按下了,做好处理之后再去调用老的消息处理函数。
但是,每个进程都有各自的私有4G空间,而你要截获的是远进程窗口消息,因此,你不能简单的直接使用SetWindowLong,因为你传过去的参数,对于远进程来说,是没有意义的。
因此,第一步,你需要将实现写入DLL,然后将DLL注入远进程。(注,DLL的DLLMain函数中实现SetWindowLong等实现)。
这种方法要比全局钩子的方法效率高。而且也很容易写。
好几种方法实现。
比较简单的一种:
采用SetWindowLong子类化该HWND,即设置该窗口的消息处理函数,然后判断消息是不是按钮被按下了,做好处理之后再去调用老的消息处理函数。
但是,每个进程都有各自的私有4G空间,而你要截获的是远进程窗口消息,因此,你不能简单的直接使用SetWindowLong,因为你传过去的参数,对于远进程来说,是没有意义的。
因此,第一步,你需要将实现写入DLL,然后将DLL注入远进程。(注,DLL的DLLMain函数中实现SetWindowLong等实现)。
这种方法要比全局钩子的方法效率高。而且也很容易写。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询