将新的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;
Run Code Online (Sandbox Code Playgroud)
所以,如果我设置ShiftState:= [ssCtrl]按
按Ctrl + HX
调用我的TwoKeyBindingHandler方法.
但是用ShiftState:= [ssShift,ssCtrl]按下
SHIFT + CTRL + HX
什么也没做.
奇怪的是,当指定ShiftState:= [ssShift,ssCtrl](这应该只影响第一个键)时按
Shift + Ctrl + H Shift + X.
调用我的TwoKeyBindingHandler方法,即使添加了第二个ShortCut没有修饰键.
任何的想法?这可能是Delphi IDE/Open Tools API的已知限制/错误吗?有一个已知的解决方法吗?
我在Delphi 2007和Delphi 10 Seattle中尝试过,没有区别.
小智 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;
Run Code Online (Sandbox Code Playgroud)
结尾;
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |