private IntPtr hHook; public const int WH_MOUSE_LL = 14; public HookProc hProc; public IntPtr SetHook() { hProc = new HookProc(MouseHookProc); //Process currentProcess = Process.GetCurrentProcess(); //ProcessModule pm = null; IntPtr appPtr = IntPtr.Zero; Process[] pro = Process.GetProcesses(); foreach (Process item in pro) { if (item.ProcessName == "calc") //如果为计算器,则记录实例句柄 { appPtr = item.Handle; //pm = item.MainModule; //currentProcess = item; break; } } hHook = WinApiDeclar.SetWindowsHookEx((int)HookType.WH_MOUSE_LL, hProc, appPtr, 0); return hHook; }
如果 SetwindowsHookEx的第三个参数 传了DLL句柄则 hHook 始终=0,不知道为什么
如果传 IntPtr.Zero 则 callback回来的 鼠标消息结构中的 目标句柄始终为0 ,代码如下
private IntPtr MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); // 这个 MyMouseHookStruct.hwnd 始终等于0 ,不知道为什么 if (nCode < 0) { return WinApiDeclar.CallNextHookEx(hHook, nCode, wParam, lParam); } else { //判断是否为我用的消息 if ((int)wParam == 0x201 ) //点击消息 { //if (MyMouseHookStruct.hwnd) //触发事件 if (_event_MouseMessage != null) { _event_MouseMessage(hHook); } } this.Point = new POINT(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y); return WinApiDeclar.CallNextHookEx(hHook, nCode, wParam, lParam); } }
我根据你的意思 ,试着做了一个DEMO,我想应该可以满足你的要求了。
请下载文件 http://files.cnblogs.com/TianMaiCheng/%E9%92%A9%E5%AD%90.zip
楼主,你在哪里?赶紧结帖啊,我需要园豆
@田麦成: 不好意思 这几天没时间上
感谢你的demo ,还是有用 ,不过我现在的具体情况是, 我在我软件的某一个步骤,要实现点击另外一个软件的 开始按钮(但是那个开始按钮找不到 句柄我用spy++ 都找不到句柄 ,估计是自绘的) 然后就不知道怎么办了,鼠标点击的时候 取不到那个点击按钮地址
可通过WindowFromPoint这个Win32 api获取
谢谢了 我那个按钮(不是windows控件) 估计也找不到