THotkey con supporto win-key?
Domanda
Esiste un modo per ottenere il componente THotkey in delphi per supportare la chiave di Windows?
O qualcuno sa di un componente che può farlo?
Grazie mille!
Soluzione
THotKey non supporta Win-Key. Aggiungerei una casella di controllo accanto ad essa forse per il modificatore Win-Key.
Altri suggerimenti
IMHO è una buona cosa che THotKey non supporti questo.
Non utilizzare il tasto Windows per le scorciatoie da tastiera nel programma, le "Linee guida per l'esperienza utente di Windows Vista" dice quanto segue in Linee guida - Interazione - Tastiera :
Non utilizzare il tasto modificatore del logo di Windows per i tasti di scelta rapida del programma. Il tasto logo Windows è riservato all'uso di Windows. Anche se una combinazione di tasti logo Windows non viene utilizzata da Windows ora, potrebbe essere in futuro.
Anche se la scorciatoia non è utilizzata da Windows, l'utilizzo di una tale scorciatoia da tastiera sarebbe fonte di confusione per gli utenti, in quanto svolgerebbe una funzione nel tuo programma, mentre altre scorciatoie come Win + E o Win + R attivano un sistema per tutta la funzione, disattivando il programma nel processo.
Modifica
THotKey è un wrapper leggero attorno a un controllo di sistema, che supporta solo le cose supportate da questo controllo di sistema. Non esiste un modo documentato per impostare altro che i modificatori Alt, Ctrl e Shift per il collegamento.
Potresti essere in grado di creare il tuo controllo per visualizzare le scorciatoie usando il tasto Windows e impostare un hook globale della tastiera (guarda nella funzione SetWindowsHookEx () API).
Non so se puoi farlo con il componente THotkey.
Ma puoi catturare il tasto Windows destro e sinistro in qualsiasi evento KeyDown usando:
if key = vk_LWin quindi showmessage ('left');
if key = vk_RWin quindi showmessage ('right');
Certo che è possibile - devi creare la tua copia di {THotKey} e modificarla un po 'per supportare anche la chiave Win. Devi aggiungere le tue funzioni KeyDown () e Repaint () a questa classe.
In questo modo:
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;
Vedi RegisterHotKey su MSDN.