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