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