3

有没有办法让delphi中的THotkey组件支持windows键?

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

多谢!

4

5 回答 5

8

恕我直言,THotKey 不支持这一点是件好事。

不要在程序中使用 windows 键作为键盘快捷键,“Windows Vista 用户体验指南”在指南 - 交互 - 键盘下说明如下:

不要将 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 组件来做到这一点。

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

if key = vk_LWin then showmessage('left');
if key = vk_RWin then showmessage('right');

于 2008-11-29T22:09:38.107 回答
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 回答
2

请参阅MSDN 上的RegisterHotKey函数。

于 2008-11-30T09:47:41.537 回答
1

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

于 2008-12-02T19:22:34.840 回答