3

WindowsキーをサポートするためにデルファイでTHotkeyコンポーネントを取得する方法はありますか?

または、これを行うことができるコンポーネントを知っている人はいますか?

ありがとうございます!

4

5 に答える 5

8

私見それはTHotKeyがこれをサポートしていないのは良いことです。

プログラムのキーボードショートカットにWindowsキーを使用しないでください。「WindowsVistaユーザーエクスペリエンスガイドライン」では、ガイドライン-インタラクション-キーボードで次のように述べています。

プログラムのショートカットキーにWindowsロゴ修飾キーを使用しないでください。WindowsロゴキーはWindows用に予約されています。Windowsロゴキーの組み合わせが現在Windowsで使用されていない場合でも、将来使用される可能性があります。

ショートカットがWindowsで使用されていない場合でも、このようなキーボードショートカットを使用すると、プログラムで機能が実行されるため、ユーザーが混乱します。Win+EやWin+ Rなどの他のショートカットは、システム全体の機能をアクティブにします。 、プロセス中のプログラムを非アクティブ化します。

編集:

THotKeyは、システムコントロールの軽いラッパーであり、このシステムコントロールがサポートするものだけをサポートします。ショートカットのAlt、Ctrl、Shift修飾子以外を設定する文書化された方法はありません。

Windowsキーを使用してショートカットを表示する独自のコントロールを作成し、グローバルキーボードフックを設定できる場合があります(SetWindowsHookEx() API関数を調べてください)。

于 2008-11-29T22:33:06.283 に答える
3

確かに可能です。{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;
于 2008-12-05T12:45:37.603 に答える
3

THotkeyコンポーネントでそれができるかどうかはわかりません。

ただし、次を使用して、任意のKeyDownイベントで左右のWindowsキーをキャプチャできます。

key = vk_LWinの場合、showmessage('left');
key = vk_RWinの場合、showmessage('right');

于 2008-11-29T22:09:38.107 に答える
2

MSDN のRegisterHotKey関数を参照してください。

于 2008-11-30T09:47:41.537 に答える
1

THotKey は Win-Key をサポートしていません。Win-Key修飾子の横にチェックボックスを追加します。

于 2008-12-02T19:22:34.840 に答える