【问题标题】:THotkey with win-key support?THotkey 支持双赢?
【发布时间】:2010-09-24 13:56:36
【问题描述】:

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

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

谢谢大家!

【问题讨论】:

    标签: delphi hotkeys


    【解决方案1】:

    我不知道你是否可以使用 THotkey 组件。

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

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

    【讨论】:

    • 大声笑,我只是在输入那个答案。你必须有一个更快的键盘。
    【解决方案2】:

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

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

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

    即使 Windows 不使用快捷键,使用这样的键盘快捷键也会让用户感到困惑,因为它会在您的程序中执行一项功能,而其他诸如 Win+E 或 Win+R 之类的快捷键会激活系统-wide 函数,在此过程中停用您的程序。

    编辑:

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

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

    【讨论】:

    • 将使用的快捷方式是用户自定义的,而不是硬编码的。然后它们被设置为全局快捷方式,这样他们就可以在不激活应用程序的情况下使用该快捷方式激活和取消激活。这是可行的,但我想让用户也可以选择使用 Windows 键。
    • 我添加了一些关于您的用例的信息。可能这将是很多工作,不知道它是否足够重要。当然还有一个问题是创建全局钩子可能不适用于所有用户(缺少权限)。
    【解决方案3】:

    参见 MSDN 上的RegisterHotKey 函数。

    【讨论】:

    • 好提示,不知道那个功能。
    • 这已经是我用来注册热键的东西了,但是为了从用户那里获得要使用的快捷方式,我正在使用 THotKey 组件。但那是不支持win键的那个,不是'RegisterHotKey'功能。我可能只是以不同的方式实现用户输入。
    【解决方案4】:

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

    【讨论】:

    • 谢谢,我会做类似的事情来完成这项工作。
    【解决方案5】:

    当然可以 - 您需要制作自己的 { 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;
    

    【讨论】:

    • 此代码在国际 Windows 版本上完全中断。
    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多