アクセラレーターキーについて


earthed  2006-08-01 11:22:50  No: 22777

フォーム上でボタンやチェックボックス等にフォーカスがある場合に
キーを押すと、Altキーを一緒に押していなくてもフォーム内のコンポーネントに
割り当てたアクセラレーターキーが応答してしまいます。
この現象を回避するにはどのようにしたら良いのでしょうか?


Syake  2006-08-01 20:43:33  No: 22778

OnKeyDownやOnKeyUpでTShiftStateで判定されたらいかがでしょうか?


earthed  2006-08-01 21:47:35  No: 22779

フォームやコンポーネントのキーイベントよりも先にアクセラレーターが
機能するので、キーイベントでは制御できません。


Syake  2006-08-02 01:10:04  No: 22780

失礼しました。
以前どこかで見たような。

procedure WM_KEYDOWN_MSG( var KeyMsg : TWMKEYDOWN ); message CM_CHILDKEY;
を追加して、ここで処理することができそうです。
procedure TFrom1.WM_KEYDOWN_MSG( var Msg : TWMKEYDOWN );
begin
  //ここで判定
end;
これなら、まずここで処理できそうです。


Syake  2006-08-02 01:21:53  No: 22781

一応、簡単に
Button1.Caption := XXXX(&A)で

procedure TfrmMain.WMKEYDOWNMSG(var Msg: TWMKEYDOWN);
begin
   if Button1.Focused = True then
   begin
      with Msg do
      begin
         if CharCode = 65 then
         begin
            Result := 1;
         end;
      end;
   end;
   inherited;
end;


Syake  2006-08-02 02:10:16  No: 22782

たびたび、すいません。
上記だけでは、[Alt]Keyを押している時も無視されます。

   function WndProc(var M: TMessage):Boolean;
private
    { Private 宣言 }

    FShiftKey :TShiftState;
    procedure WM_KEYDOWN_MSG( var KeyMsg : TWMKEYDOWN ); message CM_CHILDKEY;

{略}

procedure TFrom1.FormCreate(Sender: TObject);
begin
   Application.HookMainWindow(WndProc);
end;

function TFrom1.WndProc(var M: TMessage):Boolean;
begin
   FShiftKey := KeyDataToShiftState(TWMKey(m).KeyData);   
end;

procedure TForm1.WMKEYDOWNMSG(var Msg: TWMKEYDOWN);
begin
   if Button1.Focused = True then
   begin
      with Msg do
      begin     
         if (CharCode in [65..90]) and ((FShiftKey <> [ssAlt]) then
         begin
            Result := 1;
         end;
      end;
   end;
   inherited;
end;

です。


earthed  2006-08-02 08:29:30  No: 22783

ありがとうございます。
ちょっとコーディングに時間が掛かりそうなので、後日検証して結果を書き込み
ます。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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