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



[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???
どんなダイアログなのか気になりますね。

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