赢得钥匙支持的钥匙?

时间:2008-11-29 19:24:36

标签: delphi hotkeys

有没有在delphi中使用THotkey组件来支持windows密钥?

或者有人知道可以做到这一点的组件吗?

谢谢堆!

5 个答案:

答案 0 :(得分:8)

恕我直言,THOTKey不支持此事。

请勿在程序中使用Windows键作为键盘快捷键,“Windows Vista用户体验指南”会在Guidelines - Interaction - Keyboard下面说明以下内容:

  

不要将Windows徽标修饰键用于程序快捷键。 Windows徽标密钥保留供Windows使用。即使Windows现在没有使用Windows徽标组合键,也可能在将来使用。

即使Windows没有使用快捷方式,使用这样的键盘快捷方式也会让用户感到困惑,因为它会在你的程序中执行一项功能,而其他这样的快捷键如Win + E或Win + R会激活系统全功能,在此过程中停用您的程序。

修改

THotKey是系统控件周围的轻量级包装器,仅支持此系统控件支持的功能。除了快捷键的Alt,Ctrl和Shift修饰符之外,没有任何记录方法可以设置任何内容。

您可以创建自己的控件以使用Windows键显示快捷方式,并设置全局键盘钩子(查看 SetWindowsHookEx() API函数)。

答案 1 :(得分:3)

我不知道你是否可以用THotkey组件做到这一点。

但您可以使用以下方法在任何KeyDown事件中捕获左右Windows键:

  

如果key = vk_LWin则showmessage('left');
  如果key = vk_RWin则showmessage('right');

答案 2 :(得分: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;

答案 3 :(得分:2)

请参阅MSDN上的RegisterHotKey功能。

答案 4 :(得分:1)

THOTKey不支持Win-Key。我会在它旁边添加一个复选框,可能是Win-Key修饰符。