读书人

C#钩子设置不成功的有关问题

发布时间: 2012-08-30 09:55:54 作者: rapoo

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

读书人网 >C#

热点推荐