Question

Est-il possible d’obtenir le composant THotkey de Delphi pour prendre en charge la clé Windows?

Ou quelqu'un connaît-il un composant capable de le faire?

Merci beaucoup!

Était-ce utile?

La solution

THotKey ne supporte pas la clé Win. J'ajouterais peut-être une case à cocher pour le modificateur Win-Key.

Autres conseils

IMHO c'est une bonne chose que THotKey ne le supporte pas.

N'utilisez pas la touche Windows pour les raccourcis clavier dans votre programme, les "Consignes relatives à l'expérience utilisateur de Windows Vista". dit ce qui suit sous Principes directeurs - Interaction - Clavier :

  

N'utilisez pas la touche de modification du logo Windows pour les touches de raccourci du programme. La clé du logo Windows est réservée à Windows. Même si Windows n'utilise pas actuellement une combinaison de touches du logo Windows, il se peut que ce soit le cas ultérieurement.

Même si le raccourci n'est pas utilisé par Windows, l'utilisation d'un tel raccourci clavier serait source de confusion pour les utilisateurs, car cela exécuterait une fonction dans votre programme, tandis que d'autres raccourcis tels que Win + E ou Win + R activeraient un système. fonction globale, désactivant votre programme dans le processus.

Modifier:

THotKey est un wrapper léger autour d’un contrôle système, ne prenant en charge que les éléments pris en charge par ce contrôle système. Il n'y a aucun moyen documenté de définir quoi que ce soit à l'exception des modificateurs Alt, Ctrl et Maj pour le raccourci.

Vous pourrez peut-être créer votre propre contrôle pour afficher les raccourcis à l'aide de la touche Windows et définir un raccordement global au clavier (consultez la fonction API SetWindowsHookEx () ).

Je ne sais pas si vous pouvez le faire avec le composant THotkey.

Mais vous pouvez capturer la clé Windows gauche et droite dans n'importe quel événement KeyDown en utilisant:

  

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

Bien sûr, c'est possible - vous devez créer votre propre copie de {THotKey} et la modifier un peu pour prendre également en charge la touche Win. Vous devez ajouter vos propres fonctions KeyDown () et Repaint () à cette classe.

Comme ceci:

  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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top