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