掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
WM_APPCOMMANDをグローバルフックしてブロックするには? (ID:22160)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
------------------------------------------------------------------------------ library HookDLL; uses Windows, Messages, SysUtils, Unit1 in 'Unit1.pas' {Form1}, const MY_HOOK_MESSAGE = WM_USER + $1006; var DestWndHandle : HWND = 0; HookHandle : HHOOK = 0; function OnHookProc(nCode: Integer; aWParam: WPARAM; aLParam: LPARAM): LRESULT; stdcall; begin if nCode < 0 then begin Result := CallNextHookEx(HookHandle, nCode, aWParam, aLParam); end else if nCode = HSHELL_APPCOMMAND then begin // メッセージをアプリケーションに送る PostMessage(DestWndHandle, MY_HOOK_MESSAGE, aWParam, aLParam); Result := 1; end else begin Result := CallNextHookEx(HookHandle, nCode, aWParam, aLParam); end; end; function SetHookDLL: HHOOK; export; begin Result := 0; if HookHandle <> 0 then begin Exit; end; HookHandle := SetWindowsHookEx(WH_SHELL , @OnHookProc, HInstance, 0); Result := HookHandle; end; procedure UnHookDLL; export; begin if HookHandle = 0 then begin Exit; end; if UnhookWindowsHookEx(HookHandle) then begin HookHandle := 0; end; end; procedure SetHandleToHookDLL(hWnd: HWND); export; begin DestWndHandle := hWnd; end; exports SetHandleToHookDLL, SetHookDLL, UnHookDLL; begin // end. ------------------------------------------------------------------------------ unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const DLL_NAME = 'HookDLL.dll'; MY_HOOK_MESSAGE = WM_USER + $1006; //適当 type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private procedure OnDLLHookMessage(var Msg: TMessage); message MY_HOOK_MESSAGE; public end; var Form1: TForm1; procedure SetHandleToHookDLL(hWnd: HWND); external DLL_NAME; function SetHookDLL: HHOOK; external DLL_NAME; procedure UnHookDLL; external DLL_NAME; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin SetHandleToHookDLL(Handle); SetHookDLL; end; procedure TForm1.OnDLLHookMessage(var Msg: TMessage); begin // フックされたことを確認表示 Memo1.Lines.Add( IntToHex(Msg.WParam, 8) + '_' + IntToHex(Msg.LParam, 8) ); end; procedure TForm1.Button2Click(Sender: TObject); begin UnHookDLL; end; end. ------------------------------------------------------------------------------
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.