有没有办法让delphi中的THotkey组件支持windows键?
或者有人知道可以做到这一点的组件吗?
多谢!
恕我直言,THotKey 不支持这一点是件好事。
不要在程序中使用 windows 键作为键盘快捷键,“Windows Vista 用户体验指南”在指南 - 交互 - 键盘下说明如下:
不要将 Windows 徽标修饰键用作程序快捷键。Windows 徽标密钥保留供 Windows 使用。即使 Windows 现在不使用 Windows 徽标组合键,它也可能在将来使用。
即使 Windows 不使用该快捷键,使用这样的键盘快捷键也会让用户感到困惑,因为它会在您的程序中执行一项功能,而其他此类快捷键(如 Win+E 或 Win+R)会激活系统范围的功能,在此过程中停用您的程序。
编辑:
THotKey 是围绕系统控件的轻量级包装,仅支持该系统控件支持的内容。除了快捷键的 Alt、Ctrl 和 Shift 修饰符之外,没有记录的方法可以设置任何内容。
您可以创建自己的控件以使用 Windows 键显示快捷方式,并设置全局键盘挂钩(查看SetWindowsHookEx() API 函数)。
我不知道您是否可以使用 THotkey 组件来做到这一点。
但是您可以使用以下方法在任何 KeyDown 事件中捕获左右 Windows 键:
if key = vk_LWin then showmessage('left');
if key = vk_RWin then showmessage('right');
当然有可能——您需要制作自己的 { 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;
请参阅MSDN 上的RegisterHotKey函数。
THotKey 不支持 Win-Key。我会在它旁边添加一个复选框,可能是 Win-Key 修饰符。