TOpenDialog上でキー押下を検出するには?

解決


まこと  2008-06-29 04:29:06  No: 31104

いつもお世話になります。1点質問をお願いします。

  TOpenDialogが表示されている中で、例えば Alt + C などのショートカット
キーが押されたことを検出して、任意の動作をさせるにはどのようにすれば
よいのでしょうか。

  TApplicationEventsなどを利用してみたのですが、メッセージ自体、
Applicationに届いていないようでした。そのため、今はキー押し下げ自体
も検出できていない状況です。

  環境は次のとおりです。どうぞよろしくお願いします。

    Windows XP SP2 + Delphi6 Personal


2年前  2008-06-29 19:04:00  No: 31105

勝爺:「ヨク分かンねぇけど、これでこんなコト出来るのか? ハルコ」
春子:「そうよ、フックすれば出来ちゃうの」
勝爺:「なんだ? フック? ま、いいや、それよか、まだほっぺた痛えんだ」
春子:「マコトにツネラレたんだって?」
勝爺:「そうだよ、それも思いっきりだよ、マイッタぜ」

var
  HookHandle: HHOOK;
  AltKeyDown: Boolean;

function KeyHook(Code: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
  if (Code >= 0)and(Code = HC_ACTION) then begin
   if (LParam and $80000000) = 0 then begin
    case WParam of
     VK_MENU : AltKeyDown := True;
     ORD('C'): if AltKeyDown then ShowMessage('ALT+C');
    end;
   end else begin
    case WParam of
     VK_MENU : AltKeyDown := False;
    end;
   end;
  end;
  result := CallNextHookEx(HookHandle, Code, WParam, LParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HookHandle := SetWindowsHookEx(WH_KEYBOARD, KeyHook, 0, GetCurrentThreadID);
  try
   OpenDialog1.Execute;
  finally
   if HookHandle <> 0 then UnHookWindowsHookEx(HookHandle);
  end;
end;

真琴:「おかしいよ、ハルコさ〜ん、こっち来てぇ、学校に行く仕度しようとしたら」
春子:「どうした?マコト、おかしいって、ナニが?」
真琴:「今使ってる教科書がナイの、古いのばっかり」
春子:「ン? 古いって、いつの?」
真琴:「全部1年の時のモノ、ダレかイタズラした? あ〜もう遅刻しちゃう」
春子:「ナニ言ってンの、マコト、今1年生でしょ」
真琴:「えっ!? そんな…、まさか、…じゃ、カレンダーは? あれ〜、2年も前…」
春子:「ちょっと、おかしいのはマコトだよ、熱でもある? 今日は休んだ方がいいよ」
真琴:「そうする、…アタシ、チョット頭冷やして…冷静にならなきゃ」
春子:「じゃぁ、今日は"渚"を臨時休業にして、看病してあげようか? マコト」
真琴:「そっか、ホントに今が2年前なら、ハルコさんの"スナック渚"もあるんだ」
春子:「熱を計るから体温計もってくるネ、…マサルさ〜ん、体温計はドコだっけ」
勝爺:「そこの棚の箱にあるぞ、マコトは知恵熱でも出たのか〜?」
真琴:「だから、おじいちゃんはまだ死んでない…カイトさんもまだあの大商社の社員、もう一人は"ヒモ"やってるかぁ…」
春子:「なにブツブツ言ってンの、はい、マコト、コレで熱を…」
真琴:「あの二人がココに来るのは一年後なのよねぇ…」
春子:「え? ダレが来るって?」
真琴:「カイトさんとヒロミくん、二人でBeachBoys、来年ココに来るの」
春子:「BeachBoys? 来年? ナニよそれ…、熱のせいで変なコト言ってんの?」
真琴:「ハルコさんは信じないと思うけどぉ、アタシには分かってるの」
春子:「起きた時から変だよね、大丈夫? あれ?マコト、熱なんかナイじゃない」
真琴:「ううん、ハルコさん、すっごい熱気の夏になるよ、来年は…」


まこと  2008-06-30 06:47:57  No: 31106

ご回答、どうもありがとうございます。

  今、実際の使用方法に沿って試してみたのですが、うまくいきそうです。
もう少し確認してみて、目的が達せられたことを確認したうえでチェック
マークを付けさせていただきたいと思います。

  フックという言葉はどこかで聞いたことはあったのですが、実際に使った
のはこれが初めてです。覚える価値が高い技術のように思えますので、
これを機会に調べてみたいと思います。(恥ずかしいところですが、書いて
いただいたコードについてはほんの一部分しか理解できていません。)

  何はともあれ、長いこと悩んでいた問題に決着が付きそうです。本当に
どうもありがとうございました。


まこと  2008-07-10 15:30:43  No: 31107

遅くなってしまい、申し訳ありません。
  実際に適用して動作確認を行ったところ、うまく動作したことを確認
しました。そのため、チェックマークを付けさせていただきます。
  このたびは本当にありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加