键盘和鼠标的事件捕获时怎么实现的?

llf83855932 2009-07-24 06:01:47
只要原理就可以了。
...全文
231 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
本质就是线程注入
hinada99 2011-03-31
  • 打赏
  • 举报
回复
WinAPI
starrysky_net 2011-03-31
  • 打赏
  • 举报
回复
在MSDN中输入SetWindowsHookEx来看相关说明。全局Hook要用DLL来实现,一般用VC的Win32 DLL来做,以免占用太多资源。大致原理是,当有键盘或鼠标输入消息时,系统会将将你的DLL注入到接受该输入的进程中(如果已注入则略过),然后调用你所设置的Hook函数


多看,多练。。。。
南哥1207 2009-07-30
  • 打赏
  • 举报
回复
winio.dll
hyqhero 2009-07-30
  • 打赏
  • 举报
回复
c#例子:
public partial class Form1 : Form
{
// 安装钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
// 卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
// 继续下一个钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
// 取得当前线程编号
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();

public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hKeyboardHook = 0;
HookProc KeyboardHookProcedure;


private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if (nCode >= 0)
{
textBox1.Text = "ABC";
return 1;
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}

// 安装钩子
public void HookStart()
{
if (hKeyboardHook == 0)
{
// 创建HookProc实例
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
// 设置线程钩子
hKeyboardHook = SetWindowsHookEx(2, KeyboardHookProcedure, IntPtr.Zero,GetCurrentThreadId()
);/*GetCurrentThreadId()*/

// 如果设置钩子失败
if (hKeyboardHook == 0)
{
HookStop();
throw new Exception("SetWindowsHookEx failed.");
}
}
}
// 卸载钩子
public void HookStop()
{
bool retKeyboard = true;
if (hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}
if (!(retKeyboard && retKeyboard)) throw new Exception("UnhookWindowsHookEx failed.");
}
yymycabbage 2009-07-29
  • 打赏
  • 举报
回复
顶,钩子是好东西。
beifangqingyuan 2009-07-29
  • 打赏
  • 举报
回复
顶!!!钩子
hecker728 2009-07-28
  • 打赏
  • 举报
回复
主要还是HOOK,学习了!!!
LQknife 2009-07-28
  • 打赏
  • 举报
回复
钩子函数一搜 一堆堆的
linamong 2009-07-27
  • 打赏
  • 举报
回复
有别人些好的HOOK动态链接库 找一个来用是最方便的.
但是你要学习方法就只有自己看代码了.
luffy927 2009-07-27
  • 打赏
  • 举报
回复
学习
红街咖啡 2009-07-27
  • 打赏
  • 举报
回复
收藏上面的這些资料。
michaelnami 2009-07-27
  • 打赏
  • 举报
回复
关键就是SetWindowsHookEx(WH_KEYBOARD,KeyboradProc,glhkInstance,0);
然后自己实现 KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam)
比如说LRESULT WINAPI KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (GetAsyncKeyState (0x31)|GetAsyncKeyState (VK_NUMPAD1))
{
//printf("这是1数字键");
}
}
鼠标就是把SetWindowsHookEx第一个参数修改 以下同理
Justsoosoo 2009-07-26
  • 打赏
  • 举报
回复
学习,mark
cnzdgs 2009-07-26
  • 打赏
  • 举报
回复
在MSDN中输入SetWindowsHookEx来看相关说明。全局Hook要用DLL来实现,一般用VC的Win32 DLL来做,以免占用太多资源。大致原理是,当有键盘或鼠标输入消息时,系统会将将你的DLL注入到接受该输入的进程中(如果已注入则略过),然后调用你所设置的Hook函数。
tangyong12 2009-07-24
  • 打赏
  • 举报
回复
同意楼上的,要用到钩子才行,也给你推荐两个资源:
http://download.csdn.net/source/1389232
http://www.pcdog.com/edu/csharp/15/05/p324639.html
后面这个例子比较好懂,一看就知道了
十八道胡同 2009-07-24
  • 打赏
  • 举报
回复
我找的资料

http://www.cnblogs.com/michaelxu/archive/2006/09/22/511557.html

http://hi.baidu.com/sxy_8512/blog/item/4baaf3ee9b9f3c2d2cf534e7.html

http://thewbb.spaces.live.com/blog/cns!56C956FF8A430850!171.entry
十八道胡同 2009-07-24
  • 打赏
  • 举报
回复
要用到全局hook

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧