喫茶XRAYトップページ

[スレッド全体
]

[11067] ローカルキーフック返信 削除
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.



[11068] Re:ローカルキーフック返信 削除
2017/4/11 (火) 09:29:11 Mr.XRAY
> 動作仕様的にはよく理解できない仕様ですが,
> ローカルなキーフックを使用して [ESC] を無効にする例です.


対象が Delphi の TForm 等のコントロールだけであれば,
TApplicationEvents コンポーネントで可能です.


implementation

uses Unit2;

{$R *.DFM}

//=============================================================================
//  別のフォームをモーダル表示
//=============================================================================
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
  FKeyHook := True;
end;

//=============================================================================
//  キーフックを解除
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  FKeyHook := False;
end;

//=============================================================================
//  ApplicationEvents1コンポのOnMessageイベント処理
//=============================================================================
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  LIsDown : Boolean;
begin
  //キーが押された時に処理
  LIsDown := (Msg.LParam and (1 shl 31)) = 0;
  if LIsDown then begin
    //仮想キーコード
    if Msg.wParam = VK_ESCAPE then begin
      Handled := FKeyHook;
    end;
  end;
end;

end.



[▼次のスレッド]
INCM/CMT
Cyclamen v3.82