亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

用DELPHI編制Windows95下的鉤子函數(shù)

2019-11-18 18:52:44
字體:
供稿:網(wǎng)友
Windows消息管理機構(gòu)提供了能使應(yīng)用程序訪問控制消息流μ
'c4所謂的鉤子(HOOK)機制。鉤子有多種,分別用于捕獲某一特定類型或某一范圍的消息。如:鍵盤消息,鼠標(biāo)消息等。我們這里僅以鍵盤鉤子的使用為例,討論在DELPHI下怎樣編寫DLL程序和怎樣在自己的程序中安裝使用鍵盤鉤子函數(shù),并討論了不同程序使用同一DLL文件時怎樣共享數(shù)據(jù)。
一、 鉤子過濾函數(shù)的編寫說明
由于鉤子過濾函數(shù)必須在獨立的模塊中,也就是說我們必須首先生成一個DLL框架,然后再在其中加入鉤子函數(shù)代碼以及其他相關(guān)函數(shù)代碼。我們這里以鍵盤鉤子過濾函數(shù)的編寫為例來說明。具體步驟如下:
1、先生成一個DLL筐2架
2、編寫自己的鍵盤鉤子過濾函數(shù)
鉤子過濾函數(shù)必須是回調(diào)函數(shù),其函數(shù)的 4?形如下?o
function KeyHookPRoc(
iCode:Integer;
wParam:WPARAM;
lParam:LPARAM ) : LRESULT; stdcall ;export ;
在生成的DLL框架中加入自己的鍵盤鉤子處理函數(shù)處理鍵盤消息。
代碼如下:…
if(iCode>=0) then begin
Result:=0; //初始化返回值
// 在這里加入自己的代碼
end else
begin
Result:=CallNextHook(hOldKeyHook,iCode,wParam,lParam);
// hOldKeyHook是保存的原鍵盤過濾函數(shù) 5刂?
end;
3、 安裝鍵盤鉤子過濾函數(shù)
為安裝一個鉤子?_fd濾函數(shù)應(yīng)調(diào)用SetWindowsHookEx函數(shù)(適用于Windows3.0的SetWindowsHook鉤子安裝函數(shù)現(xiàn)在已經(jīng)廢棄不用)。該函數(shù)的原形如下:
HHOOK SetWindowsHookEx(
int idHook,  // 安裝的?_b3子類型
HOOKPROC lpfn,  // 鉤子過濾??f數(shù)地址
HINSTANCE hMod,   // 任務(wù)句柄
DWord dwThreadId   // 鉤子用于的目的
);
需要說明的是:?_a8常應(yīng)該調(diào)用MakeProcInstance函數(shù)以獲取一個輸出函數(shù)的前導(dǎo)碼的入口地址,再將此地址作為SetWindowsHookEx的第二個參數(shù)lpfn。但由于Delphi提供了"靈巧調(diào)用(smart callback)",使得MakeProcInstance可以省去,而直接將鉤子過濾函數(shù)名用作入口地址。
這樣當(dāng)應(yīng)用程序?_c3GetMessage或PeekMessage函數(shù)從消息隊列中讀消息或有按鍵消息(WM_KEYDOWN或WM_KEYUP)要處理時,系統(tǒng)就要調(diào)用鉤子過濾函數(shù)KeyHookProc處理鍵盤消息。
4、 卸載鉤子過濾函數(shù)。
當(dāng)鉤子函數(shù)不再需要時,應(yīng)調(diào)用UnHookWindowsHookProc卸載安裝的鉤子以釋放系統(tǒng)資源。
完整的程序清單如下?_ba
Library KEYHOOK;
uses Windows;
const BUFFER_SIZE=16*1024;
const HOOK_MEM_FILENAME='SAMPLE KEY_HOOK_MEM_FILE';
const HOOK_MUTEX_NAME ='SAMPLE KEY_HOOK_MUTEX_NAME';
type
TShared=record
Keys : array[0..BUFFER_SIZE] of Char;
KeyCount : Integer;
end;
PShared=^TShared;
var
MemFile,HookMutex : THandle;
hOldKeyHook : HHook;
ProcSaveExit : Pointer;
Shared : PShared;

//鍵盤鉤子過濾函數(shù)
function KeyHookProc(iCode: Integer; wParam: WPARAM ; lParam: LPARAM):LRESULT
; stdcall; export;
const KeyPressMask = $80000000;
begin
if iCode < 0 then
Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam)
else begin
if ((lParam and KeyPressMask)= 0) then // 鍵按下
begin
Shared^.Keys[Shared^.KeyCount]:=Char(wParam and $00ff);
Inc(Shared^.KeyCount);
if Shared^.KeyCount>=BUFFER_SIZE-1 then Shared^.KeyCount:=0;
end;
iCode:=-1;
Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam);
end;
end;

// 設(shè)置鉤子過濾函數(shù)
function EnableKeyHook : BOOL ; export;
begin
Shared^.KeyCount:=0; //初始化鍵盤指針
if hOldKeyHook=0 then begin
hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD,
KeyHookProc,
HInstance,
0);
end;
Result := (hOldKeyHook <> 0);
end;

//撤消鉤子過濾函數(shù)
function DisableKeyHook: BOOL ; export;
begin
if hOldKeyHook<> 0 then
begin
UnHookWindowsHookEx(hOldKeyHook); // 解除 Keyboard Hook
hOldKeyHook:= 0;
Shared^.KeyCount:=0;
end;
Result := (hOldKeyHook = 0);
end;

//取得鍵盤緩沖區(qū)中擊鍵的個數(shù)
function GetKeyCount :Integer ; export;
begin
Result:=Shared^.KeyCount;
end;

//取得鍵盤緩沖區(qū)的鍵
function GetKey(index:Integer) : Char ; export;
begin
Result:=Shared^.Keys[index];
end;

//清空鍵盤緩沖區(qū)
procedure ClearKeyString ; export;
begin
Shared^.KeyCount:=0;
end;

//DLL的退出處理過程
procedure KeyHookExit; far;
begin
if hOldKeyHook <> 0 then DisableKeyHook;
UnMapViewOfFile(Shared); // 釋放內(nèi)存映象文件
CloseHandle(MemFile); // 關(guān)閉映象文件
ExitProc := ProcSaveExit;
end;

exports // 定義輸出函數(shù)
EnableKeyHook,
DisableKeyHook,
GetKeyCount,
ClearKeyString,
GetKey;

begin
// DLL 初始化部分
HookMutex:=CreateMutex(nil,True,HOOK_MUTEX_NAME);
// 通過建立內(nèi)存映象文件以共享內(nèi)存
MemFile:=OpenFileMapping(FILE_MAP_WRITE,False,
HOOK_MEM_FILENAME);
if MemFile=0 then
MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,
SizeOf(TShared) ,HOOK_MEM_FILENAME);
Shared:=MapViewOfFile(MemFile,File_MAP_WRITE,0,0,0);
ReleaseMutex(HookMutex);
CloseHandle(HookMutex);
ProcSaveExit := ExitProc; // 保存DLL的ExitProc
ExitProc := @KeyHookExit; // 設(shè)置DLL新的ExitProc
end.
      // 源代碼結(jié)束

二、 在自己的程序中使用編制好的鍵盤鉤子過濾函數(shù)。
鉤子函數(shù)編制好后,使用起來其實很簡單:首先調(diào)用SetWindowsHookEx安裝自己的鉤子過濾函數(shù),同時保存原先的鉤子過濾函數(shù)地址。這時鉤子函數(shù)就開始起作用了,它將按照你的要求處理鍵盤消息。程序運行完畢或不再需要監(jiān)視鍵盤消息時,調(diào)用UnHookWindowsHookProc函數(shù)卸載所安裝的鉤子函數(shù),同時恢復(fù)原來的鉤子過濾函數(shù)地址。
下面就是使用在以上編制的鉤子函數(shù)的例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Panel1: TPanel;
bSetHook: TButton;
bCancelHook: TButton;
bReadKeys: TButton;
bClearKeys: TButton;
Panel2: TPanel;
procedure bSetHookClick(Sender: TObject);
procedure bCancelHookClick(Sender: TObject);
procedure bReadKeysClick(Sender: TObject);
procedure bClearKeysClick(Sender: TObject);
end;
var Form1: TForm1;

implementation
{$R *.DFM}
function EnableKeyHook : BOOL ; external 'KEYHOOK.DLL';
function DisableKeyHook : BOOL ; external 'KEYHOOK.DLL';
function GetKeyCount : Integer ; external 'KEYHOOK.DLL';
function GetKey(idx:Integer) : Char ; external 'KEYHOOK.DLL';
procedure ClearKeyString ; external 'KEYHOOK.DLL';

procedure TForm1.bSetHookClick(Sender: TObject); // 設(shè)置鍵盤鉤 7ó
begin
EnableKeyHook;
bSetHook.Enabled :=False;
bCancelHook.Enabled:=True;
bReadKeys.Enabled :=True;
bClearKeys.Enabled :=True;
Panel2.Caption:=' 鍵盤鉤子已經(jīng)設(shè)置';
end;

procedure TForm1.bCancelHookClick(Sender: TObject); // 卸載鍵盤鉤子
begin
DisableKeyHook;
bSetHook.Enabled :=True;
bCancelHook.Enabled:=False;
bReadKeys.Enabled :=False;
bClearKeys.Enabled :=False;
Panel2.Caption:=' 鍵盤鉤子沒有設(shè)置';
end;

procedure TForm1.bReadKeysClick(Sender: TObject); // 取得擊鍵的歷史記錄
var i:Integer;
begin
Memo1.Lines.Clear; // 在Memo1中顯示擊鍵歷史記錄
for i:=0 to GetKeyCount-1 do
Memo1.Text:=Memo1.Text+GetKey(i);
end;

procedure TForm1.bClearKeysClick(Sender: TObject); // 清除擊鍵歷史記錄
begin
Memo1.Clear;
ClearKeyString;
end;

end.
// 源代碼結(jié)束

三、 Windows95下DLL中實現(xiàn)共享內(nèi)存
  在上面的鉤子函數(shù)所在的DLL文件中,需要使用共享內(nèi)存,即,所有擊鍵的記錄存儲在同一個數(shù)據(jù)段中。為什么要這樣做呢?這是因為Windows95的DLL調(diào)用方法與Windows3.X的方法不同。每個進(jìn)(線)程在登錄某動態(tài)連接庫時都會為該動態(tài)連接庫傳入一個新的實例句柄(即DLL數(shù)據(jù)段的句柄)。這使得DLL各個實例之間互不干擾,但是這對那些所有DLL實例共享一組變量帶來一些困難。為了解決這個問題,我們在這兒通過建立內(nèi)存映射文件的方法來解決。即使用Windows的OpenFileMapping、CreateFileMapping和
MapViewOfFile三個函數(shù)來實現(xiàn)。使用方法如下:

MemFile是THandle類型,Shared是指針類型,HOOK_MEM_FILENAME是一常量串

MemFile:=OpenFileMapping(FILE_MAP_WRITE,False,
HOOK_MEM_FILENAME); //打開內(nèi)存映射文件
if MemFile=0 then //打開失敗則?_c2建內(nèi)存映射文件
MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,
SizeOf(TShared) ,HOOK_MEM_FILENAME);
//映射文件到變量
Shared:=MapViewOfFile(MemFile,File_MAP_WRITE,0,0,0);

到此為止,你已經(jīng)知道用Delphi編制鉤子函數(shù)有多么容易。最后不得不提醒大家:鉤子函數(shù)雖然功能比較強,但如果使用不當(dāng)將會嚴(yán)重影響系統(tǒng)的效率,所以要盡量避免使用系統(tǒng)鉤子。非要使用不可時也應(yīng)該格外小心,應(yīng)使之盡可能小地影響系統(tǒng)的運行。
[全文完]

上一篇:在Delphi的DBGrid中插入其他可視組件

下一篇:將面向?qū)ο蟮乃枷胴灤┦冀K--談Delphi開發(fā)(第二篇)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

欧美成人三区| 欧美成人tv| 91精品国产乱码久久久张津瑜| 伊人久久影院| 中文字幕无线精品亚洲乱码一区| 午夜精品美女久久久久av福利| 成年人国产精品| 日批免费观看视频| 亚洲伦理久久| 国产网友自拍视频导航网站在线观看| 亚洲日本伦理| 日本精品不卡| 欧美片第1页| 91免费视频大全| 国产美女三级视频| 中文精品在线| 一级片视频免费观看| 欧美福利电影网| 国产aⅴ一区二区三区| 亚洲成人手机在线观看| 国产成人精品一区二区免费看京| 色综合久久久久综合| 5566中文字幕| 免费看久久久| 久久久久久久久国产| 97精品视频在线观看| 福利视频一区二区三区| 日韩国产欧美一区二区| 91网站在线看| 亚洲视频在线观看三级| 亚洲一级黄色| 亚洲性生活大片| 日韩免费电影在线观看| 精品日韩欧美| 日韩黄色片在线| www.成人网.com| 91香蕉网站| 91国偷自产一区二区开放时间| 日韩久久久精品| 一道本一区二区三区| 极品日韩久久| 特级西西444| 国产午夜亚洲精品一级在线| 亚洲精品国偷自产在线99热| 成人做爰69片免网站| 午夜在线激情影院| 亚洲精品永久视频| av永久免费观看| 亚洲一区二区三区蜜桃| 四虎国产精品永久免费观看视频| 国产精品h片在线播放| 中文字幕日韩综合av| 色呦呦在线免费观看| 不卡av影片| 欧美极品美女视频| 日韩美女中文字幕| 肉色欧美久久久久久久免费看| 日韩中文字幕在线观看视频| 欧美一区二区三区四区五区| 丁香桃色午夜亚洲一区二区三区| 亚洲第一在线播放| 日韩精品永久网址| 久久久久国产精品嫩草影院| 久久精品国产亚洲一区二区三区| 最新91视频| 日日噜噜噜夜夜爽爽狠狠| 精品人妻一区二区三区换脸明星| 欧美日韩久久一区二区| 欧美日韩电影在线观看| 亚洲裸体俱乐部裸体舞表演av| 国产网红在线观看| 公交车上扒开嫩j挺进去| 99视频在线观看视频| 美女爆乳18禁www久久久久久| 亚洲人成伊人成综合网久久久| jizzjizz日本护士视频| 亚洲妇女成熟| 国产主播一区二区三区| 手机在线免费观看毛片| 性生交大片免费全黄| 亚洲黄色在线免费观看| 欧美欧美黄在线二区| 国产精品青青草| 丁香花在线观看完整版电影| 在线亚洲美日韩| 在线观看a网站| 欧美日韩国产综合在线| 国产综合av一区二区三区| 中文不卡1区2区3区| 国产午夜精品久久久久免费视| 99国产精品私拍| 午夜精品久久久久久久久| 日韩精品一线二线三线| 视频区小说区图片区| 亚洲免费av网| 欧美一级三级| 曰本色欧美视频在线| 国产一级淫片免费| 亚洲欧美激情一区二区三区| 一本一道久久综合狠狠老精东影业| 一区二区三区四区五区视频| 久久久黄色大片| 欧美又大又硬又粗bbbbb| 精品一区二区三区在线成人| 欧美日韩激情小视频| 亚洲精品乱码久久久久久蜜桃91| 蜜臀av性久久久久蜜臀av麻豆| 日韩欧美电影在线观看| 黄色在线播放网站| 亚洲国产一区二区精品专区| 最近免费观看高清韩国日本大全| 欧美美乳视频网站在线观看| japanese在线播放| 久久久国产精品免费| 日本丶国产丶欧美色综合| 亚洲综合激情网| 性一交一乱一色一免费无遮挡| 久久成人18免费观看| 国产三级精品三级在线| 中文字幕亚洲在线| 日韩精品一二| 欧美一级欧美三级在线| 人妻视频一区二区| 无码人妻精品一区二| 国产精品传媒麻豆hd| 91在线免费看片| 98精品视频| 性欧美暴力猛交另类hd| 欧美年轻男男videosbes| 涩涩视频网站| 国产亲伦免费视频播放| 玖玖在线精品| 在线免费观看黄色网址| 欧美成人第一区| 国产第一页在线观看| 免费在线观看的av| 亚洲另类黄色| 国产成人久久精品麻豆二区| 亚洲狼人综合网| 福利片在线免费观看| 国产精品4hu.www| 一道精品视频一区二区三区图片| 国产中文字幕视频| 无码 制服 丝袜 国产 另类| 日本精品视频一区| 国产综合色一区二区三区| 欧美精品激情在线| 在线免费观看污| 少妇特黄一区二区三区| 欧美一级特黄aaaaaa在线看片| 欧美福利第一页| 狠狠干一区二区| 都市激情一区| www.午夜| 日本在线免费观看视频| 看片网站在线观看| 久久网免费视频| 国产精品羞羞答答在线| 不卡av日日日| 色久优优欧美色久优优| 国产伦精品一区二区三区视频痴汉| 888奇米影视| 国产精品男女| 国产一区欧美一区| 国产中文第一页| 色视频成人在线观看免| 成人aaaa免费全部观看| 阿v免费在线观看| 尤物视频一区二区| 日本成人一区二区三区| 97在线国产视频| 亚洲欧美国产视频| 风间由美性色一区二区三区四区| av电影院在线看| www久久com| 99久久精品国产一区| 在线观看h片| 国内精品久久久久久久久久久| 久久久久成人精品无码中文字幕| 粉嫩13p一区二区三区| 性色av一区二区三区四区| 欧美xxxx日本和非洲| 免费久久99精品国产自| 日本在线视频一区二区| 美女做暖暖视频免费在线观看全部网址91| 国产久一道中文一区| 欧美一区视久久| 久久综合欧美| 国自产拍偷拍精品啪啪一区二区| 久久影视免费观看| 日韩精选在线| 国产精品高潮呻吟av| 欧美 亚欧 日韩视频在线| 成人精品一区二区三区四区| 亚洲国产古装精品网站| 九色porny丨首页入口在线| 一区二区视频播放| 亚洲综合婷婷| 波多野结衣在线观看视频| 91av网站在线播放| 日本福利一区| 91伦理视频在线观看| 狠狠色狠狠色综合婷婷tag| 欧美精品久久久久久久多人混战| 美女又爽又黄免费动漫| 看片网站在线观看| 免费看黄资源大全高清| 美乳中文字幕| 欧美日韩不卡视频| 制服丝袜中文字幕第一页| 成人黄色国产精品网站大全在线免费观看| 亚洲欧美日韩另类精品一区二区三区| 欧美一级片在线观看| 刘亦菲毛片一区二区三区| 亚洲毛片在线免费观看| 日韩精品免费视频人成| 国产夫妻在线观看| 强开小嫩苞一区二区三区网站| 新91视频在线观看| 亚洲女同性videos| 午夜在线观看视频| 人人草在线观看| 欧洲一区二区三区在线| 超碰资源在线| 成人毛片视频在线观看| 伊人久久一区二区| 中文乱码字幕av网站| 91精品中文字幕一区二区三区| 久久久久美女| 欧美精品videos另类日本| 粉嫩91精品久久久久久久99蜜桃| www.97超碰| 婷婷久久综合九色综合99蜜桃| 成年人在线观看视频| 成人动漫在线一区| 国产一区二区在线免费播放| 欧美无遮挡国产欧美另类| 国产伦精品一区二区三区精品视频| 99精品久久免费看蜜臀剧情介绍| 精品一区在线看| 亚洲人成色777777精品音频| 最近中文字幕第一页| 男人和女人啪啪网站| 色呦呦网站一区| 精品国产鲁一鲁一区二区三区| 亚洲欧洲另类| 无码久久精品国产亚洲av影片| 日韩毛片在线视频| 久久亚洲国产精品日日av夜夜| 亚洲视频欧美在线| 精品肉丝脚一区二区三区| 久久精品久久久久久久| 99热99精品| 亚洲日本乱码在线观看| 中日韩美女免费视频网站在线观看| 制服丝袜综合日韩欧美| 欧美亚洲精品在线| 超碰成人在线观看| 国产综合福利在线| 日韩免费一区二区三区在线播放| 精品日韩一区| 欧美日韩一级在线观看| 中文在线三区| 国内精品免费午夜毛片| 欧美交换配乱吟粗大25p| 亚洲国产精品人人做人人爽| 国产女主播在线直播| 亚洲黄色小说网站| 亚洲欧美中文字幕在线观看| 国产精品一区二区三区毛片淫片| 欧美男人操女人视频| 欧美三级蜜桃2在线观看| 色悠悠国产精品| 韩国日本不卡在线| 性感美女激情视频在线观看| 日本一级片在线播放| 综合国产在线| 人妻偷人精品一区二区三区| 国产精品激情| 欧美成人精品一区二区三区| 99久久综合99久久综合网站| 精品无码国产一区二区三区av| 国产另类xxxxhd高清| 在线亚洲欧美专区二区| 国产精品7m凸凹视频分类| 日韩欧美一二三四区| 亚洲欧美变态国产另类| 国产三级精品三级在线观看国产| 成人黄色a**站在线观看| 欧美日韩精品欧美日韩精品一| 国产一区二区在线免费播放| 亚洲天堂视频在线| 不卡的av中文字幕| 国产真实夫妇交换视频| 久久久美女视频| 绿色成人影院| 欧美激情精品久久久久久久变态| 国产成人精品免费看| 成人一级福利| 精品欧美日韩在线| 国产欧美日韩在线播放| 欧美色欧美亚洲高清在线视频| 日韩av网站在线观看| 日韩av电影免费在线观看| 在线视频一二三区| 大伊香蕉精品视频在线| 国产精品久久久久久久成人午夜| 伊人免费在线| 成人在线观看91| 91麻豆国产香蕉久久精品| 黄色高清在线观看| caoporn免费在线视频| 欧美午夜国产| 久久偷看各类女兵18女厕嘘嘘| 亚洲人亚洲人成电影网站色| 国产蜜臀av在线播放| 天天操天天干天天操天天干| www.亚洲男人天堂| 北条麻妃亚洲一区| 亚洲经典三级| 色欧美日韩亚洲| 四虎国产精品免费久久5151| 精品国产在天天线2019| 亚洲一区二区日韩| 鲁一鲁一鲁一鲁一色| 亚洲香蕉伊综合在人在线视看| 欧美日韩午夜爽爽| 久久精品成人欧美大片古装|