WindowsキーをサポートするためにデルファイでTHotkeyコンポーネントを取得する方法はありますか?
または、これを行うことができるコンポーネントを知っている人はいますか?
ありがとうございます!
私見それはTHotKeyがこれをサポートしていないのは良いことです。
プログラムのキーボードショートカットにWindowsキーを使用しないでください。「WindowsVistaユーザーエクスペリエンスガイドライン」では、ガイドライン-インタラクション-キーボードで次のように述べています。
プログラムのショートカットキーにWindowsロゴ修飾キーを使用しないでください。WindowsロゴキーはWindows用に予約されています。Windowsロゴキーの組み合わせが現在Windowsで使用されていない場合でも、将来使用される可能性があります。
ショートカットがWindowsで使用されていない場合でも、このようなキーボードショートカットを使用すると、プログラムで機能が実行されるため、ユーザーが混乱します。Win+EやWin+ Rなどの他のショートカットは、システム全体の機能をアクティブにします。 、プロセス中のプログラムを非アクティブ化します。
編集:
THotKeyは、システムコントロールの軽いラッパーであり、このシステムコントロールがサポートするものだけをサポートします。ショートカットのAlt、Ctrl、Shift修飾子以外を設定する文書化された方法はありません。
Windowsキーを使用してショートカットを表示する独自のコントロールを作成し、グローバルキーボードフックを設定できる場合があります(SetWindowsHookEx() API関数を調べてください)。
確かに可能です。{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;
THotkeyコンポーネントでそれができるかどうかはわかりません。
ただし、次を使用して、任意のKeyDownイベントで左右のWindowsキーをキャプチャできます。
key = vk_LWinの場合、showmessage('left');
key = vk_RWinの場合、showmessage('right');
MSDN のRegisterHotKey関数を参照してください。
THotKey は Win-Key をサポートしていません。Win-Key修飾子の横にチェックボックスを追加します。