Domanda

Esiste un modo per ottenere il componente THotkey in delphi per supportare la chiave di Windows?

O qualcuno sa di un componente che può farlo?

Grazie mille!

È stato utile?

Soluzione

THotKey non supporta Win-Key. Aggiungerei una casella di controllo accanto ad essa forse per il modificatore Win-Key.

Altri suggerimenti

IMHO è una buona cosa che THotKey non supporti questo.

Non utilizzare il tasto Windows per le scorciatoie da tastiera nel programma, le "Linee guida per l'esperienza utente di Windows Vista" dice quanto segue in Linee guida - Interazione - Tastiera :

  

Non utilizzare il tasto modificatore del logo di Windows per i tasti di scelta rapida del programma. Il tasto logo Windows è riservato all'uso di Windows. Anche se una combinazione di tasti logo Windows non viene utilizzata da Windows ora, potrebbe essere in futuro.

Anche se la scorciatoia non è utilizzata da Windows, l'utilizzo di una tale scorciatoia da tastiera sarebbe fonte di confusione per gli utenti, in quanto svolgerebbe una funzione nel tuo programma, mentre altre scorciatoie come Win + E o Win + R attivano un sistema per tutta la funzione, disattivando il programma nel processo.

Modifica

THotKey è un wrapper leggero attorno a un controllo di sistema, che supporta solo le cose supportate da questo controllo di sistema. Non esiste un modo documentato per impostare altro che i modificatori Alt, Ctrl e Shift per il collegamento.

Potresti essere in grado di creare il tuo controllo per visualizzare le scorciatoie usando il tasto Windows e impostare un hook globale della tastiera (guarda nella funzione SetWindowsHookEx () API).

Non so se puoi farlo con il componente THotkey.

Ma puoi catturare il tasto Windows destro e sinistro in qualsiasi evento KeyDown usando:

  

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

Certo che è possibile - devi creare la tua copia di {THotKey} e modificarla un po 'per supportare anche la chiave Win. Devi aggiungere le tue funzioni KeyDown () e Repaint () a questa classe.

In questo modo:

  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;

Vedi RegisterHotKey su MSDN.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top