如何给指定的程序挂钩子?
我打开了一个记事本,成功给他挂了一个键盘钩子,但是我在记事本中按键盘的时候,记事本就出错关闭了,怎么回事?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#没有研究过。 --------------------编程问答--------------------
也是用钩子吗?
--------------------编程问答-------------------- 你弄那东西用E语言或者c++做吧。 c#不给力啊 --------------------编程问答-------------------- c# 明确表示不支持全局线程钩子,所以的你的应该做个独立的DLL挂钩到其他的程序,诸如记事本。
钩子回调子程,和DLL基地址,以及线程ID是必须的如果是当前程序则DLL可以为空,相差为GetThreadProcess全局的为零。 --------------------编程问答-------------------- 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 之类的.... --------------------编程问答--------------------
全局钩子可以用,我只是想拦截指定程序的消息 --------------------编程问答--------------------
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);
这个不是全局钩子吗 我只想拦截某个程序的消息 --------------------编程问答-------------------- --------------------编程问答-------------------- 拦截记事本[钩子]
http://download.csdn.net/detail/tangyanzhi1111/5647827
c# dll注入钩子(全局钩子)
http://download.csdn.net/detail/tangyanzhi1111/4385675
补充:.NET技术 , C#