日期:2014-05-18  浏览次数:21112 次

C#钩子设置不成功的问题
我的应用程序的主窗体中包含了一个自定义控件,自定义控件相当于一个窗体容器,现在,我将windowWord窗体嵌套在这个自定义控件中,我想给windowWord窗体设置一个钩子用于获取这个窗体的鼠标键盘消息!注意,windowWord就是独立的一个MircsoftWord窗体,激活此窗体后,该窗体的进程ID与进程句柄应该都已经获取正确!
 下面是我设置钩子的代码:
C# code

 public void HookStart()
        {
            int wordCalcID = 0;
            int wordCalcProcess = 0;
            const int PROCESS_ALL_ACCESS = 0x1F0FFF;   
            const int PROCESS_VM_READ = 0x0010;   
            const int PROCESS_VM_WRITE = 0x0020;   
            if(wordWnd!= null)
            {  
                GetWindowThreadProcessId((System.IntPtr)wordWnd, out wordCalcID);
                wordCalcProcess = OpenProcess(PROCESS_ALL_ACCESS, false, wordCalcID);
            }
            else
            {
                MessageBox.Show("Not Found WordWindow");
            }
            if (hKeyboardHook == 0)
            {
                // 创建HookProc实例
                KeyboardHookProcedure = new HookProc(KeyAndMouseHookProc);
                // 设置线程钩子
                if (wordCalcProcess !=0)
                {
                    hKeyboardHook = SetWindowsHookEx(7, KeyboardHookProcedure,(System.IntPtr)wordCalcProcess,
                                            0);
                    // 如果设置钩子失败
                    if (hKeyboardHook == 0)
                    {
                        HookStop();
                        throw new Exception("SetWindowsHookEx failed.");
                    }
                }
                else if (wordCalcProcess==0)
                {
                    MessageBox.Show("ThreadId found error");
                }
              
            }
        }



 hKeyboardHook返回值一直是0。请问到底是什么原因啊 ,是不是参数设置问题,或者是不能用这种方法。。求大神解析!感激不尽啊 !~很急!~

------解决方案--------------------
SetWindowsHookEx 后,你用getlasterror看看错误码
------解决方案--------------------
把7改成13
------解决方案--------------------
呵呵,同志哥,我也遇到同一个问题,不过我解决了。最近我也在搞钩子,我的QQ:1967106500


应该是这句代码错了。
GetWindowThreadProcessId((System.IntPtr)wordWnd, out wordCalcID);

wordCalcID得到的值是进程号,你要注入主线程才行,前面加一个=,估计就OK了。
wordCalcID=GetWindowThreadProcessId((System.IntPtr)wordWnd, out wordCalcID);

你试试,不行再聊。
------解决方案--------------------
钩主模块还是进程呢?其实.Net已经封装好了
wordCalcProcess = OpenProcess(PROCESS_ALL_ACCESS, false, wordCalcID);


进程句柄:Process.GetProcessById(wordCalcID).Handle
主窗口句柄:Process.GetProcessById(wordCalcID).MainWindowHandle