亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mousehook.pas

?? 用DLL文件的形式掛載鍵盤與鼠標鉤子的例子
?? PAS
字號:
{

 MouseHook DLL Load & TMouseHook Class Unit
 
 2004-09-08
 
 Copyright ? Thomas Yao

}

unit MouseHook;

interface

uses
  Windows, Messages, Classes;

const
  DEFDLLNAME = 'mousehook.dll';
  MappingFileName = '57D6A971_MouseHookDLL_442C0DB1';
  MSGMOUSEMOVE: PChar = 'MSGMOUSEMOVE57D6A971-049B-45AF-A8CD-37E0B706E036';
  MSGMOUSECLICK: PChar = 'MSGMOUSECLICK442C0DB1-3198-4C2B-A718-143F6E2D1760';

type
  // 全局映像文件, 如果沒有TMappingMem, hook就只對本進程起作用
  TMappingMem = record
    Handle: DWORD;
    MsgID: DWORD;
    MouseStruct: TMOUSEHOOKSTRUCT;
  end;
  PMappingMem = ^TMappingMem;

  // 函數原型
  TEnableMouseHook = function(hWindow: HWND; Blocked: BOOL): BOOL; stdcall;

  TDisableMouseHook = function: BOOL; stdcall;

  // 事件對象
  TMouseMoveNotify = procedure(const Handle: HWND; const X, Y: Integer) of object;

  TMouseClickNotify = procedure(const Handle: HWND; const X, Y: Integer) of object;

  // 基類
  TMouseHookBase = class
  private
    FDLLName: string;
    FDLLLoaded: BOOL;
    FListenerHandle: HWND;
    FActive: BOOL;
    hMappingFile: THandle;
    pMapMem: PMappingMem;
    FBlocked: BOOL;
    procedure WndProc(var Message: TMessage);
    procedure SetDLLName(const Value: string);
    procedure SetBlocked(const Value: BOOL);
  protected
    MSG_MOUSEMOVE: UINT;
    MSG_MOUSECLICK: UINT;
    // 消息到事件
    procedure ProcessMessage(var Message: TMessage); virtual; abstract;
  public
    constructor Create; virtual;
    destructor Destroy; override;
    function Start: BOOL; virtual;
    procedure Stop; virtual;
    property DLLLoaded: BOOL read FDLLLoaded;
    property Active: BOOL read FActive;
  published
    property DLLName: string read FDLLName write SetDLLName;
    property Blocked: BOOL read FBlocked write SetBlocked;
  end;

  // 子類TMouseHook, 只提供事件接口實現
  TMouseHook = class(TMouseHookBase)
  private
    FOnMouseMove: TMouseMoveNotify;
    FOnMouseClick: TMouseClickNotify;
    procedure DoMouseMove(const Handle: HWND; const X, Y: Integer);
    procedure DoMouseClick(const Handle: HWND; const X, Y: Integer);
  protected
    procedure ProcessMessage(var Message: TMessage); override;
  public

  published
    property DLLName;
    property OnMouseMove: TMouseMoveNotify read FOnMouseMove write FOnMouseMove;
    property OnMouseClick: TMouseClickNotify read FOnMouseClick write FOnMouseClick;
  end;

var
  // 全局變量
  DLLLoaded: BOOL = False;

  StartMouseHook: TEnableMouseHook;
  StopMouseHook: TDisableMouseHook;

implementation

var
  DLLHandle: HMODULE;

procedure UnloadDLL;                    // 卸載dll
begin
  DLLLoaded := False;

  if DLLHandle <> 0 then
  begin
    FreeLibrary(DLLHandle);
    DLLHandle := 0;
    // 釋放函數指針
    @StartMouseHook := nil;
    @StopMouseHook := nil;
  end;
end;

function LoadDLL(const FileName: string): Integer; // 加載dll
begin
  Result := 0;

  if DLLLoaded then
    Exit;

  DLLHandle := LoadLibraryEx(PChar(FileName), 0, 0);
  if DLLHandle <> 0 then
  begin
    DLLLoaded := True;

    // 傳遞函數指針
    @StartMouseHook := GetProcAddress(DLLHandle, 'EnableMouseHook');
    @StopMouseHook := GetProcAddress(DLLHandle, 'DisableMouseHook');

    if (@StartMouseHook = nil) or (@StopMouseHook = nil) then
    begin
      Result := 0;
      UnloadDLL;
      Exit;
    end;

    Result := 1;
  end
  else
    MessageBox(0, PChar(DEFDLLNAME + ' library could not be loaded !'),
      'Error', MB_ICONERROR);
end;

{ TInputHook }

constructor TMouseHookBase.Create;
begin
  pMapMem := nil;
  hMappingFile := 0;
  FDLLName := DEFDLLNAME;
  FBlocked := True;
  // 產生獨一無二的消息id
  MSG_MOUSEMOVE := RegisterWindowMessage(MSGMOUSEMOVE);
  MSG_MOUSECLICK := RegisterWindowMessage(MSGMOUSECLICK);
end;

destructor TMouseHookBase.Destroy;
begin
  Stop;
  inherited;
end;

procedure TMouseHookBase.WndProc(var Message: TMessage);
begin
  if pMapMem = nil then
  begin
    hMappingFile := OpenFileMapping(FILE_MAP_WRITE, False, MappingFileName);
    if hMappingFile = 0 then
      MessageBox(0, 'cannot create share memory!', 'Error', MB_OK or MB_ICONERROR);
    pMapMem := MapViewOfFile(hMappingFile, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
    if pMapMem = nil then
    begin
      CloseHandle(hMappingFile);
      MessageBox(0, 'cannot map share memory!', 'Error', MB_OK or MB_ICONERROR);
    end;
  end;
  if pMapMem = nil then
    Exit;

  // 消息過濾
  if (Message.Msg = MSG_MOUSEMOVE) or (Message.Msg = MSG_MOUSECLICK) then
  begin
    Message.WParam := pMapMem.MouseStruct.hwnd;
    Message.LParam := (pMapMem.MouseStruct.pt.X and $FFFF) or
      (pMapMem.MouseStruct.pt.Y shl 16);
    ProcessMessage(Message);
  end
  else
    // 不需要處理的消息交給OS默認處理函數
    Message.Result := DefWindowProc(FListenerHandle, Message.Msg, Message.wParam,
      Message.lParam);
end;

function TMouseHookBase.Start: BOOL;
var
  hookRes: Integer;
begin
  Result := False;
  if (not FActive) and (not FDLLLoaded) then
  begin
    if FDLLName = '' then
    begin
      Result := False;
      Exit;
    end
    else
    begin
      hookRes := LoadDLL(FDLLName);
      if hookRes = 0 then
      begin
        Result := False;
        Exit;
      end
      else
      begin
        // 這是關鍵所在, 通過AllocateHWnd創建一個不可見的窗體, 來實現所有消息的中轉
        // 通過TMouseHookBase的WndProc來實現對消息的響應
        FListenerHandle := AllocateHWnd(WndProc);
        if FListenerHandle = 0 then
        begin
          Result := False;
          Exit;
        end
        else
        begin
          if StartMouseHook(FListenerHandle, FBlocked) then
          begin
            Result := True;
            FDLLLoaded := True;
            FActive := True;
          end
          else
          begin
            Result := False;
            Exit;
          end;
        end;
      end;
    end;
  end;
end;

procedure TMouseHookBase.Stop;
begin
  if FActive then
  begin
    if FListenerHandle <> 0 then
    begin
      pMapMem := nil;
      if hMappingFile <> 0 then
      begin
        CloseHandle(hMappingFile);
        hMappingFile := 0;
      end;
      DeallocateHWnd(FListenerHandle);
      StopMouseHook;
      FListenerHandle := 0;
    end;
    UnloadDLL;
    FActive := False;
    FDLLLoaded := False;
  end;
end;

procedure TMouseHookBase.SetDLLName(const Value: string);
begin
  if FActive then
    MessageBox(0, 'Cannot activate hook because DLL name is not set.',
      'Info', MB_OK + MB_ICONERROR)
  else
    FDLLName := Value;
end;

procedure TMouseHookBase.SetBlocked(const Value: BOOL);
begin
  if FActive then
    MessageBox(0, 'Cannot set block property of hook because hook is active!',
      'Info', MB_OK + MB_ICONERROR)
  else
    FBlocked := Value;
end;

{ TMouseHook }

procedure TMouseHook.DoMouseClick(const Handle: HWND; const X, Y: Integer);
begin
  if Assigned(FOnMouseClick) then
    FOnMouseClick(Handle, X, Y);
end;

procedure TMouseHook.DoMouseMove(const Handle: HWND; const X, Y: Integer);
begin
  if Assigned(FOnMouseMove) then
    FOnMouseMove(Handle, X, Y);
end;

procedure TMouseHook.ProcessMessage(var Message: TMessage);
begin
  if Message.Msg = MSG_MOUSEMOVE then
  begin
    DoMouseMove(Message.WParam, Message.LParamLo, Message.LParamHi);
  end
  else if Message.Msg = MSG_MOUSECLICK then
  begin
    DoMouseClick(Message.WParam, Message.LParamLo, Message.LParamHi);
  end;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
毛片av一区二区| 国产一区二区不卡老阿姨| 欧美色图在线观看| 秋霞电影网一区二区| 欧美一级欧美三级| 成人毛片老司机大片| 五月激情综合网| 国产精品少妇自拍| 欧美精品乱人伦久久久久久| 国产精品1区2区3区| 一区二区三区四区蜜桃| 欧美成人一区二区三区在线观看 | 国产亚洲午夜高清国产拍精品 | 丝袜诱惑制服诱惑色一区在线观看 | 亚洲免费av高清| 久久丝袜美腿综合| 日韩久久免费av| 欧美亚洲动漫制服丝袜| 色婷婷久久综合| 成人av电影在线| 激情另类小说区图片区视频区| 亚洲午夜久久久久久久久电影网 | 欧美中文字幕一区二区三区亚洲| 亚洲精品中文字幕在线观看| 91精品国产全国免费观看| 欧美国产成人精品| 一本大道久久a久久综合婷婷| 中文字幕一区免费在线观看 | 亚洲h精品动漫在线观看| 欧美韩日一区二区三区四区| 亚洲综合精品自拍| 中文字幕亚洲电影| 欧美三级在线视频| 蜜臀av一区二区在线免费观看| 一区二区三区在线免费| 国产精品一区在线观看乱码 | 欧洲精品一区二区三区在线观看| 亚洲天堂成人在线观看| 91亚洲国产成人精品一区二三 | 久久99蜜桃精品| 精品粉嫩aⅴ一区二区三区四区| 天天射综合影视| 中文一区二区在线观看| 在线观看网站黄不卡| 欧美日韩一区二区在线观看视频| 精品欧美黑人一区二区三区| 亚洲综合一区二区三区| 高清国产一区二区三区| 老司机精品视频线观看86| 亚洲视频 欧洲视频| 91久久线看在观草草青青| 免费成人在线视频观看| 色综合天天综合色综合av| 国产精品资源网站| 欧美另类高清zo欧美| 日韩精品每日更新| 日韩理论电影院| 欧美极品少妇xxxxⅹ高跟鞋| 国产一区二区女| 91视频国产资源| 久久久久久一级片| 欧美日韩精品综合在线| 国产成人在线观看| 久久黄色级2电影| www一区二区| 欧美日韩一区二区在线观看视频| 一区二区三区小说| 成人美女视频在线看| 国产精品久久久久影院老司| 国产成人午夜99999| 99久久99久久免费精品蜜臀| 最新久久zyz资源站| 丁香一区二区三区| 在线免费观看日本欧美| 久久草av在线| 亚洲影视在线播放| 成人动漫一区二区在线| 国产黄色精品网站| 精品国产乱码久久久久久蜜臀| www.久久精品| 亚洲国产精品一区二区www在线| 91九色最新地址| 中文字幕一区二区三区四区 | 91麻豆精品国产91久久久资源速度| 欧美喷水一区二区| 久久久蜜桃精品| 亚洲一区国产视频| 亚洲福利视频导航| 亚洲综合免费观看高清在线观看| 国产精品久99| 日韩欧美中文字幕制服| 日本久久一区二区| 成人午夜视频在线观看| 一区二区成人在线| 精品国产髙清在线看国产毛片| 精品一区二区在线观看| 欧美在线小视频| 全部av―极品视觉盛宴亚洲| 久久综合给合久久狠狠狠97色69| 欧美一区二区三区在线电影| 久久久精品综合| 91免费看视频| 蜜桃久久av一区| 精品一区二区影视| 国产精品日产欧美久久久久| 亚洲制服欧美中文字幕中文字幕| 欧美不卡一二三| 偷拍亚洲欧洲综合| 欧美www视频| 一区二区欧美国产| 91在线视频观看| 亚洲v日本v欧美v久久精品| 亚洲成人av资源| 一区二区三区四区不卡在线| 国产精品理论片在线观看| 国产精品国产精品国产专区不片| 色综合天天综合网国产成人综合天| 日韩va欧美va亚洲va久久| 在线免费观看日韩欧美| 欧美精品一区二区蜜臀亚洲| 日本电影亚洲天堂一区| 欧美伊人久久久久久久久影院 | 欧美日韩在线精品一区二区三区激情 | 欧美视频第二页| 国产精品美女一区二区三区| 在线免费观看日本欧美| 欧美女孩性生活视频| 欧美一区二区三区男人的天堂| 色乱码一区二区三区88| 中文字幕不卡在线播放| 精品一区免费av| 久久人人超碰精品| 成人欧美一区二区三区视频网页| 国产精品乱码人人做人人爱 | 国产一区二区三区免费看| 亚洲视频每日更新| 日韩美女主播在线视频一区二区三区| 99久久国产综合精品色伊| 欧美午夜视频网站| 99视频精品在线| 欧美一级生活片| 一区免费观看视频| 91一区二区三区在线播放| 国内精品嫩模私拍在线| 91农村精品一区二区在线| 国产久卡久卡久卡久卡视频精品| 91精品国产欧美一区二区18| 欧美成人一级视频| 亚洲国产激情av| 欧美日韩大陆一区二区| 免费观看日韩电影| 99re这里只有精品6| 国产亚洲欧美日韩俺去了| 日本va欧美va瓶| 成人国产精品免费观看| 国产精品一区在线观看你懂的| 成人av网站在线| 亚洲精品伦理在线| 国产成人av一区二区三区在线| 久久免费视频色| 欧美最猛黑人xxxxx猛交| 欧美专区在线观看一区| 美女一区二区视频| 成人欧美一区二区三区视频网页| 久久老女人爱爱| 免费不卡在线观看| av高清久久久| 91精品国产高清一区二区三区| 欧美女孩性生活视频| 精品亚洲成a人| 亚洲一区自拍偷拍| 国产又黄又大久久| 亚洲视频中文字幕| 91玉足脚交白嫩脚丫在线播放| 日韩电影在线免费观看| 日本不卡的三区四区五区| 极品尤物av久久免费看| 精品少妇一区二区| 国产伦精品一区二区三区在线观看 | 日韩黄色免费电影| 日本一区二区高清| 亚洲国产中文字幕在线视频综合| 精品一区二区在线看| 91精品国产综合久久精品app | 国产欧美日韩亚州综合 | 日韩欧美一级特黄在线播放| 国产校园另类小说区| 丝袜亚洲另类欧美综合| 亚洲欧美成人一区二区三区| 亚洲精品国产无天堂网2021| 国产精品久久久久影院亚瑟| 一区二区三区 在线观看视频| 欧美一级片免费看| 欧美一二三区在线| 亚洲欧美综合色| 国产成人av电影在线观看| 欧美一区二区视频网站| 亚洲地区一二三色| 欧美手机在线视频| 一区二区三区中文在线|