Есть ли способ заставить компонент THotkey в delphi поддерживать ключ Windows?
Или кто-нибудь знает компонент, который может это сделать?
Огромное спасибо!
Есть ли способ заставить компонент THotkey в delphi поддерживать ключ Windows?
Или кто-нибудь знает компонент, который может это сделать?
Огромное спасибо!
THotKey не поддерживает Win-Key. Я бы добавил рядом с ним флажок, возможно, для модификатора Win-Key.
ИМХО хорошо, что THotKey этого не поддерживает.
Не используйте клавишу Windows для сочетаний клавиш в вашей программе, в «Руководстве по взаимодействию с пользователем Windows Vista» говорится следующее в разделе Рекомендации — Взаимодействие — Клавиатура:
Не используйте клавишу-модификатор логотипа Windows для сочетания клавиш программы. Клавиша с логотипом Windows зарезервирована для использования в Windows. Даже если комбинация клавиш с логотипом Windows сейчас не используется Windows, она может появиться в будущем.
Даже если это сочетание клавиш не используется Windows, использование такого сочетания клавиш может ввести пользователей в заблуждение, поскольку оно будет выполнять функцию в вашей программе, в то время как другие такие сочетания клавиш, такие как Win+E или Win+R, активируют общесистемную функцию. , деактивируя вашу программу в процессе.
Изменить:
THotKey — это легкая оболочка системного элемента управления, поддерживающая только то, что поддерживает этот системный элемент управления. Не существует документированного способа установить для ярлыка что-либо, кроме модификаторов Alt, Ctrl и Shift.
Возможно, вы сможете создать собственный элемент управления для отображения ярлыков с помощью клавиши Windows и установить глобальную перехватчик клавиатуры (посмотрите на функцию API SetWindowsHookEx()).
Я не знаю, сможете ли вы сделать это с компонентом THotkey.
Но вы можете захватить левый и правый ключ Windows в любом событии KeyDown, используя:
если key = vk_LWin, то showmessage('left');
если key = vk_RWin, то 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;
См. функцию RegisterHotKey в MSDN.