易截截图软件、单文件、免安装、纯绿色、仅160KB

读书 Delphi下深入Windows核心编程 第二天

技术交流,DH讲解. 今天进入这书第二章 钩子(HOOK).
先说说钩子是什么?
钩子其实就在你环境中加上一层过滤,在特殊情况下就触发钩子回调函数.
比如说我们安装了全局的键盘钩子,那么当我们按动键盘上面的键的时候,钩子的回调函数就会触发.
我们也能看到本来是直来直往的,结果现在中间安装了一层过滤,系统的效率肯定会有所下降的.
要了解,我们只需要知道3个函数:
1 上钩函数: function SetWindowsHookEx(
idHook: Integer;//钩子的类型
lpfn: TFNHookProc; //回调函数指针
hmod: HINST; //一般为0或者Instance
dwThreadId: DWORD//全局钩子就为0,不然就为指定进程id
): HHOOK; stdcall;//成功就返回一个值,不成功就为0
其中钩子类型有:
{$EXTERNALSYM WH_MIN}
WH_MIN = -1;
{$EXTERNALSYM WH_MSGFILTER}
WH_MSGFILTER = -1;
{$EXTERNALSYM WH_JOURNALRECORD}
WH_JOURNALRECORD = 0;
{$EXTERNALSYM WH_JOURNALPLAYBACK}
WH_JOURNALPLAYBACK = 1;
{$EXTERNALSYM WH_KEYBOARD}
WH_KEYBOARD = 2;
{$EXTERNALSYM WH_GETMESSAGE}
WH_GETMESSAGE = 3;
{$EXTERNALSYM WH_CALLWNDPROC}
WH_CALLWNDPROC = 4;
{$EXTERNALSYM WH_CBT}
WH_CBT = 5;
{$EXTERNALSYM WH_SYSMSGFILTER}
WH_SYSMSGFILTER = 6;
{$EXTERNALSYM WH_MOUSE}
WH_MOUSE = 7;
{$EXTERNALSYM WH_HARDWARE}
WH_HARDWARE = 8;
{$EXTERNALSYM WH_DEBUG}
WH_DEBUG = 9;
{$EXTERNALSYM WH_SHELL}
WH_SHELL = 10;
{$EXTERNALSYM WH_FOREGROUNDIDLE}
WH_FOREGROUNDIDLE = 11;
{$EXTERNALSYM WH_CALLWNDPROCRET}
WH_CALLWNDPROCRET = 12;
{$EXTERNALSYM WH_KEYBOARD_LL}
WH_KEYBOARD_LL = 13;
{$EXTERNALSYM WH_MOUSE_LL}
WH_MOUSE_LL = 14;
{$EXTERNALSYM WH_MAX}
WH_MAX = 14;
{$EXTERNALSYM WH_MINHOOK}
WH_MINHOOK = WH_MIN;
{$EXTERNALSYM WH_MAXHOOK}
WH_MAXHOOK = WH_MAX;
具体作用基本上就看名字就知道,个别的我也不知道,具体的大家看MSDN吧.这个是个葵花宝典.

2 卸钩函数:
function UnhookWindowsHookEx(
hhk: HHOOK//上钩函数返回的句柄
): BOOL; stdcall;
3 具体的钩子回调函数:
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
好的说了这么多,看例子:


相关文档:

关于delphi Move函数的用法详解

  使用delphi多年,前些天忽然遇到不会string转pbyte,很是失落,此时对于编程基本功的重要性深有体会.这其中用到MOVE函数.
 搞了好一会才搞明白其用法.所以想贴出来帮助需要帮助的人.
var
   s:string;
   ps:Pchar;
   b:pbyte;
   len:integer;
begin
 &nb ......

unix C 、delphi的多语言文本字符换行的问题

今天项目组发生一个事情就是,后台aix上对多语言文本(英语+汉字)换行问题搞不太清楚。
最早前台的多字符的代码我检查了一下(按照0-128以外算中文的代码)发现不是安全的代码。
(delphi 7.0)
delphi安全的混合字符的操作方法是:
在strsUtils单元中
leftstr
MidStr
Rightstr
aix下是: ......

Delphi中用ADO系列控件获得存储过程的Return值

在Delphi中Ado系列控件使用xxxxx.Parameters.Refresh,可以获得存储过程的Return值
以TADOStoredProc为例
  ADOStoredProc1.Connection := 'xxxx';
  ADOStoredProc1.ProcedureName := 'XXXX';
  ADOStoredProc1.Parameters.Refresh;   //刷新存储过程的参数列表
 //参数赋值
 ADO ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号