有没有在delphi中使用THotkey组件来支持windows密钥?
或者有人知道可以做到这一点的组件吗?
谢谢堆!
答案 0 :(得分:8)
恕我直言,THOTKey不支持此事。
请勿在程序中使用Windows键作为键盘快捷键,“Windows Vista用户体验指南”会在Guidelines - Interaction - Keyboard下面说明以下内容:
不要将Windows徽标修饰键用于程序快捷键。 Windows徽标密钥保留供Windows使用。即使Windows现在没有使用Windows徽标组合键,也可能在将来使用。
即使Windows没有使用快捷方式,使用这样的键盘快捷方式也会让用户感到困惑,因为它会在你的程序中执行一项功能,而其他这样的快捷键如Win + E或Win + R会激活系统全功能,在此过程中停用您的程序。
修改强>
THotKey是系统控件周围的轻量级包装器,仅支持此系统控件支持的功能。除了快捷键的Alt,Ctrl和Shift修饰符之外,没有任何记录方法可以设置任何内容。
您可以创建自己的控件以使用Windows键显示快捷方式,并设置全局键盘钩子(查看 SetWindowsHookEx() API函数)。
答案 1 :(得分:3)
我不知道你是否可以用THotkey组件做到这一点。
但您可以使用以下方法在任何KeyDown事件中捕获左右Windows键:
如果key = vk_LWin则showmessage('left');
如果key = vk_RWin则showmessage('right');
答案 2 :(得分:3)
当然可能 - 您需要制作自己的{THotKey}副本并稍微调整一下以支持Win键。您需要将自己的KeyDown()和Repaint()函数添加到此类。
像这样:
TMyCustomHotKey = class(TWinControl)
public
WinKey: boolean;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
constructor Create(AOwner: TComponent); override;
end;
TMyHotKey = class(TMyCustomHotKey)
...
procedure TMyCustomHotKey.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
a : integer;
lbl : string;
tmphot : tshortcut;
begin
a:= 0;
if GetAsyncKeyState(VK_LWIN) <> 0 then a:= 1;
if GetAsyncKeyState(VK_RWIN) <> 0 then a:= 1;
if a=1 then begin
winkey := true;
end else
begin
winkey := false;
end;
rePaint();
}
procedure TMyCustomHotKey.WMPaint(var Message: TWMPaint);
var
PS: TPaintStruct;
DC: HDC;
Canvas: TCanvas;
i: Integer;
X, Y: Integer;
OldColor: TColor;
Size: TSize;
Max: Integer;
s, Palabra, PrevWord: string;
OldPen, DrawPen: HPEN;
tmphot : tshortcut;
Key: Word;
Shift: TShiftState;
lbl ,res: string;
keyboardState: TKeyboardState;
asciiResult: Integer;
begin
DC := Message.DC;
if DC = 0 then DC := BeginPaint(Handle, PS);
Canvas := TCanvas.Create;
try
OldColor := Font.Color;
Canvas.Handle := DC;
Canvas.Font.Name := Font.Name;
Canvas.Font.Size := Font.Size;
with Canvas do
begin
Brush.Color := Self.Color;
FillRect(Self.ClientRect);
Font.Color := OldColor;
tmphot := gethotkey;
ShortCutToKey(tmphot, Key, Shift);
res := GetCharFromVKey(key);
if (winkey = false) and (key = 0 ) and (tmphot = 0)then
BEGIN lbl := 'Enter hotkey [CTRL/ALT/WIN] + Key' ;
TextOut(1 ,1,lbl) ;
END
else begin
if winkey then lbl := 'Win +' else lbl := '';
if ssAlt in Shift then lbl := lbl+ 'Alt + ';
if ssShift in Shift then lbl := lbl+ 'Shift + ';
if (not winkey) and (ssCtrl in Shift) then lbl := lbl+ 'Ctrl + ';
lbl := lbl+ res;
end;
TextOut(1 ,1,lbl);
end;
finally
if Message.DC = 0 then EndPaint(Handle, PS);
end;
Canvas.Free;
SETCARETPOS(1,1);
end;
答案 3 :(得分:2)
请参阅MSDN上的RegisterHotKey功能。
答案 4 :(得分:1)
THOTKey不支持Win-Key。我会在它旁边添加一个复选框,可能是Win-Key修饰符。