2017/4/11 (火) 09:26:55 Mr.XRAY |
[ESCキーの無効について]
http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201704/17040001.txt
動作仕様的にはよく理解できない仕様ですが,
ローカルなキーフックを使用して [ESC] を無効にする例です.
implementation
uses Unit2;
{$R *.DFM}
var
KeyHookHandle : HHOOK=0;
//-----------------------------------------------------------------------------
// キーフックのコールバック関数
// wPar : 仮想キーコード
// lPar : キーの状態(MSDNのKeyboardProc callbackiに説明あり)
//-----------------------------------------------------------------------------
function KeyHookProc(nCode:integer; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
begin
Result := 0;
if nCode < 0 then begin
Result := CallNextHookEx(KeyHookHandle, nCode, wPar, lPar);
exit;
end;
if nCode = HC_ACTION then begin
if (wPar = VK_ESCAPE) then begin
//本来動作を無効にする
Result := 1;
end;
end;
if Result = 0 then begin
Result := CallNextHookEx(KeyHookHandle, nCode, wPar, lPar);
end;
end;
//=============================================================================
// 別のフォームをモーダル表示
//=============================================================================
procedure TForm1.Button5Click(Sender: TObject);
var
AForm : TForm2;
begin
AForm := TForm2.Create(Self);
try
AForm.Left := 500;
AForm.Top := 300;
AForm.ShowModal;
finally
FreeAndNil(AForm);
end;
end;
//=============================================================================
// キーフック開始
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
if KeyHookHandle = 0 then begin
KeyHookHandle := SetWindowsHookEx(WH_KEYBOARD,
@KeyHookProc,
0,
GetCurrentThreadId);
end;
end;
//=============================================================================
// キーフックを解
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
if KeyHookHandle <> 0 then begin
UnhookWindowsHookEx(KeyHookHandle);
KeyHookHandle := 0;
end;
end;
end.
|
|