首页 新闻 会员 周边 捐助

C# 做的全局鼠标钩子 怎么才能取到鼠标点击的句柄?

0
悬赏园豆:100 [已解决问题] 解决于 2015-01-07 11:33
 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);
            }
        }
丶被遗忘者的主页 丶被遗忘者 | 初学一级 | 园豆:18
提问于:2014-12-26 16:34
< >
分享
最佳答案
1

我根据你的意思 ,试着做了一个DEMO,我想应该可以满足你的要求了。

请下载文件 http://files.cnblogs.com/TianMaiCheng/%E9%92%A9%E5%AD%90.zip

收获园豆:100
需要格局 | 老鸟四级 |园豆:2145 | 2014-12-27 13:19

楼主,你在哪里?赶紧结帖啊,我需要园豆

需要格局 | 园豆:2145 (老鸟四级) | 2014-12-30 11:19

@田麦成: 不好意思 这几天没时间上

感谢你的demo ,还是有用 ,不过我现在的具体情况是, 我在我软件的某一个步骤,要实现点击另外一个软件的 开始按钮(但是那个开始按钮找不到 句柄我用spy++ 都找不到句柄 ,估计是自绘的) 然后就不知道怎么办了,鼠标点击的时候 取不到那个点击按钮地址

丶被遗忘者 | 园豆:18 (初学一级) | 2015-01-07 11:38
其他回答(1)
0

可通过WindowFromPoint这个Win32 api获取

jello chen | 园豆:7336 (大侠五级) | 2014-12-27 13:03

谢谢了  我那个按钮(不是windows控件) 估计也找不到

支持(0) 反对(0) 丶被遗忘者 | 园豆:18 (初学一级) | 2015-01-07 15:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册