为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找。

KeyBoardHook.dll代码

  1. library KeyBoardHook;
  2. { Important note about DLL memory management: ShareMem must be the
  3. first unit in your library's USES clause AND your project's (select
  4. Project-View Source) USES clause if your DLL exports any procedures or
  5. functions that pass strings as parameters or function results. This
  6. applies to all strings passed to and from your DLL--even those that
  7. are nested in records and classes. ShareMem is the interface unit to
  8. the BORLNDMM.DLL shared memory manager, which must be deployed along
  9. with your DLL. To avoid using BORLNDMM.DLL, pass string information
  10. using PChar or ShortString parameters. }
  11. uses
  12. SysUtils,Windows,Messages,
  13. Classes;
  14. var
  15. fHook:HHOOK;
  16. //执行挂钩程序的窗体句柄
  17. CallHandle:HWND;
  18. {$R *.res}
  19. //回调过程
  20. function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
  21. var
  22. processid:Cardinal;
  23. begin
  24. //如果有键盘动作
  25. if code = HC_Action then
  26. begin
  27. //获取注入进程的进程id
  28. processid := GetCurrentProcessId;
  29. //如果CallHandle,则查找TestMain窗体句柄
  30. if CallHandle = 0 then
  31. CallHandle := FindWindow(nil,'TestMain');
  32. //获取按键状态 小于0表示按下,如果不做判断,按键按下或抬起都会执行SendMessage
  33. //下面发送WM_USER+101消息,此消息可以用自定义的消息标识发送
  34. if GetKeyState(wParam) < 0 then
  35. SendMessage(CallHandle,WM_USER+101,wParam,processid);
  36. end
  37. else
  38. //下一个钩子
  39. Result := CallNextHookEx(fHook,code,wParam,lParam);
  40. end;
  41. procedure SetHook;stdcall;
  42. begin
  43. //挂钩,这里没有做挂钩失败的提示
  44. fHook := SetWindowsHookEx(WH_KEYBOARD,@HookProc,HInstance,0);
  45. end;
  46. procedure StopHook;stdcall;
  47. begin
  48. //摘钩
  49. if fHook <> 0 then
  50. UnhookWindowsHookEx(fHook);
  51. end;
  52. exports
  53. SetHook name 'SetHook',
  54. StopHook name 'StopHook';
  55. begin
  56. //初始CallHandle为0
  57. CallHandle := 0;
  58. end.

TestKeyBoardHook主程序代码

  1. {
  2. 此窗体用来执行挂钩,为了方便起见,我们把系统的按键返回到该窗体的Memo组件中进行
  3. 显示,所以在dll中,做了获取主窗体的句柄的工作,以便发消息给主窗体,告诉它是哪个
  4. 按键被按下
  5. }
  6. unit TestMain;
  7. interface
  8. uses
  9. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  10. Dialogs, StdCtrls,TlHelp32;
  11. type
  12. TfrmTestMain = class(TForm)
  13. Memo1: TMemo;
  14. btn_SetHook: TButton;
  15. btn_StopHook: TButton;
  16. procedure btn_SetHookClick(Sender: TObject);
  17. procedure btn_StopHookClick(Sender: TObject);
  18. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  19. private
  20. { Private declarations }
  21. procedure WndProc(var Message: TMessage);override;
  22. public
  23. { Public declarations }
  24. end;
  25. var
  26. frmTestMain: TfrmTestMain;
  27. implementation
  28. procedure SetHook;stdcall;external 'KeyBoardHook';
  29. procedure StopHook;stdcall;external 'KeyBoardHook';
  30. {$R *.dfm}
  31. procedure TfrmTestMain.btn_SetHookClick(Sender: TObject);
  32. begin
  33. SetHook;
  34. end;
  35. procedure TfrmTestMain.btn_StopHookClick(Sender: TObject);
  36. begin
  37. StopHook;
  38. end;
  39. procedure TfrmTestMain.WndProc(var Message: TMessage);
  40. var
  41. hSnapShot:THandle;
  42. pEntry:TProcessEntry32;
  43. find:Boolean;
  44. proName:string;
  45. begin
  46. if Message.Msg = WM_USER+101 then
  47. begin
  48. //创建进程快照
  49. hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  50. pEntry.dwSize := SizeOf(pEntry);
  51. find := Process32First(hSnapShot,pEntry);
  52. while find do
  53. begin
  54. //取进程名字
  55. proName := pEntry.szExeFile;
  56. if pEntry.th32ProcessID = Message.LParam then Break;
  57. find := Process32Next(hSnapShot,pEntry);
  58. end;
  59. Memo1.Lines.Add('进程:' + proName + ',ID:' +IntToStr(Message.LParam)+'按下按键:'+Chr(Message.WParam));
  60. CloseHandle(hSnapShot);
  61. end;
  62. inherited;
  63. end;
  64. procedure TfrmTestMain.FormClose(Sender: TObject;
  65. var Action: TCloseAction);
  66. begin
  67. StopHook;
  68. end;
  69. end.

运行结果

http://blog.csdn.net/bdmh/article/details/6124127

全局键盘钩子(WH_KEYBOARD)的更多相关文章

  1. [转载] 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  2. 使用raw input 代替全局键盘钩子

    //关于raw input 请查看msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536%28v=vs.85%29 ...

  3. c#-全局键盘钩子

    using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...

  4. 【VB6】全局键盘钩子

    基本也没啥好说的,不要用到木马及恶意程序中是以前从VB.NET程序改到VB6的,阉割了一些功能,只提供键盘Hook功能想要截获热键可以在处理函数中返回1,里面有示例 下载地址 http://pan.b ...

  5. C#简单鼠标键盘钩子KMHook

    简介:由三个文件构成Pinvo.cs.KeyboardHook.cs.MouseHook.cs Pinvo.cs 是KeyboardHook与MouseHook需要的一些常量消息的定义 Keyboar ...

  6. 2.添加键盘钩子。向进程中注入dll

    学习笔记 1.首先要建立mfc的动态链接库.在def文件中放入要导出的函数名. 2.添加函数如下 //安装钩子 //HHOOK SetWindowsHookEx( // int idHook,//钩子 ...

  7. C#实现键盘钩子

    前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...

  8. C#鼠标键盘钩子

    using System;using System.Collections.Generic; using System.Reflection; using System.Runtime.Interop ...

  9. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

随机推荐

  1. 前端利器,如何使用fiddle拦截在线css进行先下调试

    fiddle的功能相当的强悍,用户也非常广,不过今天我就教大家用fiddle进行前端调试. 首先下载软件fiddle,点击对应的版本下载安装. 安装成功后打开看到右侧的导航栏: 点击AutoRespo ...

  2. %hd %d %ld %u ......

    %d 有符号10进制整数 %ld 长整型 %hd短整型%md,m指定的是输出字段的宽度,默认左补空格, 如果数据的位数小于m,则左端补以空格,若大于m,则 按实际位数输出,如: printf(&quo ...

  3. 关于MySQL性能的比较

    需求:在传递一组职位编号的时候,需要统计该职位的 当天的投递情况 和 有历史记录以来总的投递量 解决方案一: 每次都进行一次数据库查询,遍历职位id,再根据职位id去查询相应时间内的投递量 /** * ...

  4. 定制化Azure站点Java运行环境(2)

    Azure Website上发布Java web应用 在Azure站点上发布Java Web应用非常简单,可以使用git从源代码发布,也可以使用FTP/FTPs直接发布,本节介绍FTP方式. 准备好你 ...

  5. 在Azure Cloud Service中部署Java Web App(2)

    接上文. 9.在进行发布之前,需要对我们的订阅做一些设置,因为默认情况下,Azure的service end指向的是Azure global的站点,如果我们要将服务发布在Azure的中国站点,需要做下 ...

  6. Sql Server专题:SQL 经典实例

    SQL 经典实例 1.实例表: Student(S#,Sname,Sage,Ssex) 学生表 S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Course(C#,Cname ...

  7. 检测android的网络链接状态

    http://www.oschina.net/question/100267_61129?sort=default&p=1#tags_nav http://www.cnblogs.com/to ...

  8. ios 开发指南

    苹果Xcode帮助文档阅读指南 iOS开发官方文档汇总 翻译"iPhone SDK 开发"之UIKit使用… iOS中arc的设置与使用

  9. wait函数返回值总结,孤儿进程与僵尸进程[总结]

    http://blog.csdn.net/astrotycoon/article/details/41172389 wait函数返回值总结 http://www.cnblogs.com/Anker/p ...

  10. Linux下多核环境Erlang的SMP測试

    目标 (1)       了解在多核cpu环境下,erlang并发进程调度对各个cpu核负载的影响: (2)       Erlang虚拟机的内存添加机理: (3)       Erlang进程的调度 ...