THotkey avec un support Win-Key?
Question
Est-il possible d’obtenir le composant THotkey de Delphi pour prendre en charge la clé Windows?
Ou quelqu'un connaît-il un composant capable de le faire?
Merci beaucoup!
La solution
THotKey ne supporte pas la clé Win. J'ajouterais peut-être une case à cocher pour le modificateur Win-Key.
Autres conseils
IMHO c'est une bonne chose que THotKey ne le supporte pas.
N'utilisez pas la touche Windows pour les raccourcis clavier dans votre programme, les "Consignes relatives à l'expérience utilisateur de Windows Vista". dit ce qui suit sous Principes directeurs - Interaction - Clavier :
N'utilisez pas la touche de modification du logo Windows pour les touches de raccourci du programme. La clé du logo Windows est réservée à Windows. Même si Windows n'utilise pas actuellement une combinaison de touches du logo Windows, il se peut que ce soit le cas ultérieurement.
Même si le raccourci n'est pas utilisé par Windows, l'utilisation d'un tel raccourci clavier serait source de confusion pour les utilisateurs, car cela exécuterait une fonction dans votre programme, tandis que d'autres raccourcis tels que Win + E ou Win + R activeraient un système. fonction globale, désactivant votre programme dans le processus.
Modifier:
THotKey est un wrapper léger autour d’un contrôle système, ne prenant en charge que les éléments pris en charge par ce contrôle système. Il n'y a aucun moyen documenté de définir quoi que ce soit à l'exception des modificateurs Alt, Ctrl et Maj pour le raccourci.
Vous pourrez peut-être créer votre propre contrôle pour afficher les raccourcis à l'aide de la touche Windows et définir un raccordement global au clavier (consultez la fonction API SetWindowsHookEx () ).
Je ne sais pas si vous pouvez le faire avec le composant THotkey.
Mais vous pouvez capturer la clé Windows gauche et droite dans n'importe quel événement KeyDown en utilisant:
if key = vk_LWin then showmessage ('left');
si key = vk_RWin, alors showmessage ('right');
Bien sûr, c'est possible - vous devez créer votre propre copie de {THotKey} et la modifier un peu pour prendre également en charge la touche Win. Vous devez ajouter vos propres fonctions KeyDown () et Repaint () à cette classe.
Comme ceci:
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;
Voir la la fonction RegisterHotKey sur MSDN.