当前位置:编程学习 > C#/ASP.NET >>

如何给指定的程序挂钩子?

我打开了一个记事本,成功给他挂了一个键盘钩子,但是我在记事本中按键盘的时候,记事本就出错关闭了,怎么回事?
HookHandle = API_YCS.HookCode.SetWindowsHookEx(
                WH_KEYBOARD,
                HookProc,                  Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]),
                 GetWindowThreadProcessId(FindWindow("Notepad", null),out ID)); --------------------编程问答-------------------- 之前拿E语言弄过外挂,钩子镶嵌一个外挂UI进去。c#没有研究过。 --------------------编程问答--------------------
引用 1 楼 gzw13999 的回复:
之前拿E语言弄过外挂,钩子镶嵌一个外挂UI进去。c#没有研究过。

也是用钩子吗?
--------------------编程问答-------------------- 你弄那东西用E语言或者c++做吧。 c#不给力啊 --------------------编程问答--------------------    c# 明确表示不支持全局线程钩子,所以的你的应该做个独立的DLL挂钩到其他的程序,诸如记事本。

 钩子回调子程,和DLL基地址,以及线程ID是必须的如果是当前程序则DLL可以为空,相差为GetThreadProcess全局的为零。 --------------------编程问答-------------------- HookProc怎么写的? --------------------编程问答--------------------
引用 5 楼 caozhy 的回复:
HookProc怎么写的?

 private bool HookProc(int nCode, int wParam, IntPtr lParam)
{
  if (nCode >= 0 && IsHasKeyboardEvent)
  {
   KeyMSG KeyboardStruct = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));
   KeyEventArgs e = new KeyEventArgs((Keys)(KeyboardStruct.vkCode);
   if (KeyDownEvent != null && (wParam == KeyboardStruct.WM_KEYDOWN))
   { KeyDownEvent.Invoke(null, e); }
   CallNextHookEx……
}
主要是我在这个方法里加了断点,在记事本中按键盘的时候,根本就没到运行到断点那,就是根本我就没收到消息,记事本就报错了
--------------------编程问答-------------------- 几个月之前,我也想用C#做一个小附件,统计键盘的按键次数,天天对着电脑敲键盘。能知道自己每天击打多少次键盘也挺有意思的,可惜的真心做不出来。有几位大神说可以用键盘钩子,但是没代码可以参考。这是也就不了了之了。帮楼主顶起,希望有一个源代码什么的 --------------------编程问答-------------------- 真心表示 c# 可以实现,不过用的是不安全代码,调用  win 32 API 之类的.... --------------------编程问答--------------------
引用 7 楼 chaoyangzhixue 的回复:
几个月之前,我也想用C#做一个小附件,统计键盘的按键次数,天天对着电脑敲键盘。能知道自己每天击打多少次键盘也挺有意思的,可惜的真心做不出来。有几位大神说可以用键盘钩子,但是没代码可以参考。这是也就不了了之了。帮楼主顶起,希望有一个源代码什么的

全局钩子可以用,我只是想拦截指定程序的消息 --------------------编程问答--------------------
引用 7 楼 chaoyangzhixue 的回复:
几个月之前,我也想用C#做一个小附件,统计键盘的按键次数,天天对着电脑敲键盘。能知道自己每天击打多少次键盘也挺有意思的,可惜的真心做不出来。有几位大神说可以用键盘钩子,但是没代码可以参考。这是也就不了了之了。帮楼主顶起,希望有一个源代码什么的

HookHandle = API_YCS.HookCode.SetWindowsHookEx(
                WH_KEYBOARDLL,
                HookProc,                  Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]),
                0);
这个好使
HookProc回调函数里自己写就行 --------------------编程问答-------------------- 没人知道吗………… --------------------编程问答--------------------
 
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
                //hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                //            KeyBoardHookProcedure,
                //            Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                _HHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                                          _KeyBoardHookProcedure,
                                          hInstance, 0);
--------------------编程问答--------------------
引用 12 楼 corner_hzd 的回复:
 
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);

IntPtr hInstance = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
                //hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                //            KeyBoardHookProcedure,
                //            Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                _HHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                                          _KeyBoardHookProcedure,
                                          hInstance, 0);

这个不是全局钩子吗  我只想拦截某个程序的消息 --------------------编程问答-------------------- --------------------编程问答-------------------- 拦截记事本[钩子]
http://download.csdn.net/detail/tangyanzhi1111/5647827


c# dll注入钩子(全局钩子)
http://download.csdn.net/detail/tangyanzhi1111/4385675
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,