2016-01-31 3 views
5

Delphi IDEに新しいショートカットを追加することは、Open Tools APIがこのためのサービスを提供するため、あまり難しくありません。ユーザーが1つのキーXToolsApiを使用してDelphi IDEにキーバインドShift + Ctrl + H Xを追加するにはどうすればよいですか?

Xがすべき続い

Shiftキー+ Ctrlキー+ Hを押したときに、私が起こるために何かをしたい

:追加のショートカットのようなWordStarの追加:私は明らかに、より複雑な何かをしようとしていますShiftキーの状態に関係なく機能します。私はShiftStateを設定した場合

procedure TGxKeyboardBinding.BindKeyboard(const BindingServices: IOTAKeyBindingServices); 
const 
    DefaultKeyBindingsFlag = kfImplicitShift + kfImplicitModifier + kfImplicitKeypad; 
var 
    GExpertsShortcut: Byte; 
    ShiftState: TShiftState; 
    FirstShortCut: TShortCut; 
    SecondShortCut: TShortCut; 
begin 
    GExpertsShortcut := Ord('H'); 
    ShiftState := [ssShift, ssCtrl]; 
    FirstShortCut := ShortCut(GExpertsShortcut, ShiftState); 
    SecondShortCut := ShortCut(Ord('X'), []); 
    BindingServices.AddKeyBinding([FirstShortCut, SecondShortCut], 
    TwoKeyBindingHandler, nil, 
    DefaultKeyBindingsFlag, '', ''); 
end; 

ので、::= [ssCtrl]

は私TwoKeyBindingHandlerメソッドを呼び出し

はCtrl + H Xを押し

は、これは私のコードです。

しかしShiftStateと:= [ssShift、ssCtrl]を押し

Shiftキー+ Ctrlキー+ H X

は何もしません。奇妙なことに

、ShiftState指定:

Shiftキーを押すと(最初のキーに影響を与える必要があります)= [ssShift、ssCtrlを] + Ctrlキー+ H Shiftキー+ X

もかかわらず、私のTwoKeyBindingHandlerメソッドを呼び出します2番目のShortCutは修飾キーなしで追加されます。

任意のアイデア?これはDelphi IDE/Open Tools APIの既知の制限/バグでしょうか?既知の回避策はありますか?

私はDelphi 2007とDelphi 10 Seattleで試してみましたが、違いはありません。

答えて

3

GetKeyState関数を使用して実行できるはずです。

プログラムには2つの操作があります。ドロップダウンメニュー項目を開くと考えてください。 ctr-shift-hが押されると、プログラムは 'Menu'が開いていることをフラグする必要があり、無効なキーが押された場合、後続のキー押下でオプションが有効になるか 'メニュー'が閉じられます。

function IsKeyDown(const VK: integer): boolean; 
begin 
    IsKeyDown := GetKeyState(VK) and $8000 <> 0; 
end; 

procedure Form1.OnkeyDown(...) 
begin 
if Not H_MenuOpen then 
if IsKeyDown(vk_Control) and IskeyDown(vk_Shift) and IsKeyDown(vk_H) then 
begin 
     //Some Boolean in the form 
     H_MenuOpen:=True; 
     //Will probably need to invalidate some parameters here so that 
     //no control tries to process the key 
     exit; 
end; 

if H_MenuOpen then 
begin 
     if key=vk_X then 
     begin 
      //x has been pressed 
      *Your code here* 
      //possibly invalidate some of the params again 
      exit; 
     end; 
    //Nothing valid 
    H_MenuOpen:=False; 
end; 

end;

+0

ありがとう、それは一般的にホットキーをチェックするための解決策ですが、私はOnKeyDownを処理するフォームがない私の特別なケースには当てはまりません。 (それ以外は:IsKeyDownを複数回呼び出すとパフォーマンスが良くないとは思わないので、GetKeyStateを1回だけ呼び出してキーの組み合わせを確認してください) – dummzeuch

+0

アプリケーションのwm_keydownメッセージは引き続き処理できます。 –

+1

はい、できます。 Open Tools APIを使用して解決策を見つけることができない場合、私はおそらくそれを正確に行います。残念なことに、私はまた、IDEがいくつかの追加のコードを必要とするかもしれないそのキーを見ていないようにする必要があります。しかし、私がそこに着くと、私はその橋を渡ります。 – dummzeuch

1

OK、明らかに誰も答えを見つけていないことから、ここで私がやってしまったものです:

私はすでに2番目のキーのために可能なすべての文字をリストヒントウィンドウを表示することを計画していた(実際にそのコードが既に働いていましたこの質問に対する彼女の答えでHelen Fairgrieveが提案したアプローチを使用して)代わりに、私は今だけワンキーショートカットを登録します。

BindingServices.AddKeyBinding([FirstShortCut], 
    TwoKeyBindingHandler, nil, 
    DefaultKeyBindingsFlag, '', ''); 

そしてTwoKeyBindingHandler方法で

は、私はショートカットとしてこれらの文字が含まれているポップアップメニューを表示します。その後、IDE/VCL/Windowsが残りの部分を処理します。

これは、それがどのように見えるかです: animated GIF with the result

それは実際の質問への答えではないのですが、それは私の問題を解決します。申し訳ありません。