喫茶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.



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


今回のケースは Konnoya さんが示したコードが一番簡単ですけどね.
ローカルなキーフックの例の参考として...


[11070] Re2:ローカルキーフック返信 削除
2017/4/11 (火) 10:21:00 Mr.XRAY
> 今回のケースは Konnoya さんが示したコードが一番簡単ですけどね.

欲を言えば,こんなのがいいですね.

    procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY;
              ^^^^^^^^^^
これなら
[メッセージ処理メソッドの作成]
http://mrxray.on.coocan.jp/Delphi/Others/A_IDETechnique.htm#07

で比較的作成しやすいので.


[11110] Re3:ローカルキーフック返信 削除
2017/4/16 (日) 23:36:09 Konnoya
▼ Mr.XRAYさん
こんばんは、Mr.XRAY様。
ちょっとした小旅行に出かけていて、掲示板を見る事すら出来ませんでした(笑)
Wifiが使えないビジネスホテルがあるとは…初めて(汗

> > 今回のケースは Konnoya さんが示したコードが一番簡単ですけどね.
>
> 欲を言えば,こんなのがいいですね.
>
>     procedure CMChildKey(var Message: TCMChildKey); message CM_CHILDKEY;
>               ^^^^^^^^^^


そうですね。メッセージの文字列をアンダーバー無しでそのまま関数名称にした方が良いですね。
質問者の方の環境がDelphi2010という事で、FMXは関係無いと思い、
こうした特定のプラットフォームに依存する従来のコードを提示してしまって、
ミスったかなと思っていました。
良く判っていないのですが、Mr.XRAY様のTApplicationEventによる方法なら
プラットフォームに依存しない?のかなと思ってたりして^^

他の方も申されている様に、質問者の方のTrueとFalseが逆だと思います。
しかし、[ESC]キーでキャンセルはNG???
どんなダイアログなのか気になりますね。

[11106] 特定のキーの無効化返信 削除
2017/4/14 (金) 18:01:18 Mr.XRAY
> [ESCキーの無効について]
> http://madia.world.coocan.jp/cgi-bin/DelphiBBS/wwwlng.cgi?print+201704/17040001.txt


題材として面白そうなので記事にしておきました.

[256] [04_ローカルキーフックによる特定のキー操作の無効化]
http://mrxray.on.coocan.jp/Delphi/plSamples/256_LocalHookKeyMouse.htm#04

からページの最後までが該当します.
ちなみに,特定のキーの無効化です.
特定の「文字」の無効化ではありません.


[11107] Re:特定のキーの無効化返信 削除
2017/4/14 (金) 23:04:49 Mr.XRAY
> ちなみに,特定のキーの無効化です.

キーコードいうのは,キーボードの各キーに割り当てられいる固有の値です.


INCM/CMT
Cyclamen v3.82