如何使用ToolsApi将键绑定Shift + Ctrl + H X添加到Delphi IDE?

时间:2016-01-31 16:37:47

标签: delphi otapi

将新的ShortCut添加到Delphi IDE并不困难,因为Open Tools API为此提供了一项服务。我正在尝试一些显然更复杂的东西:像其他ShortCut一样添加Wordstar:

当用户按下

时,我想要发生一些事情

Shift + Ctrl + H后跟单键X

无论Shift键的状态如何,X都应该起作用。

这是我的代码:

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;

所以,如果我设置ShiftState:= [ssCtrl]按

Ctrl + H X

调用我的TwoKeyBindingHandler方法。

但是用ShiftState:= [ssShift,ssCtrl]按

Shift + Ctrl + H X

什么也没做。

奇怪的是,当指定ShiftState:= [ssShift,ssCtrl](应该只影响第一个键)时按

Shift + Ctrl + H Shift + X

调用我的TwoKeyBindingHandler方法,即使在没有修饰键的情况下添加了第二个ShortCut。

有什么想法吗?这可能是Delphi IDE / Open Tools API的已知限制/错误吗?有没有已知的解决方法?

我在Delphi 2007和Delphi 10 Seattle中尝试过,没有区别。

2 个答案:

答案 0 :(得分:2)

您应该可以使用GetKeyState函数来完成它。

该程序有两个操作 - 将其视为打开下拉菜单项。当按下ctr-shift-h时,您的程序将需要标记“菜单”。现在已打开,随后的按键将激活一个选项或关闭“菜单”。如果按下了无效的密钥。

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;

端;

答案 1 :(得分:1)

好的,因为显然没有人找到答案,这就是我最终做的事情:

我已经计划显示一个提示窗口,列出第二个键的所有可能字符(实际上该代码已经正常工作,使用Helen Fairgrieve建议的方法来回答这个问题)。相反,我现在只注册一键快捷键:

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

在TwoKeyBindingHandler方法中,我显示一个弹出菜单,其中包含这些字符作为快捷方式。 IDE / VCL / Windows然后为我处理剩下的事情。

这就是它的样子: animated GIF with the result

这不是实际问题的答案,但它解决了我的问题。对不起,如果你在这里期待更多的东西。