THotkey с поддержкой Win-Key?

Есть ли способ заставить компонент THotkey в delphi поддерживать ключ Windows?

Или кто-нибудь знает компонент, который может это сделать?

Огромное спасибо!


person HannesNZ    schedule 29.11.2008    source источник


Ответы (5)


THotKey не поддерживает Win-Key. Я бы добавил рядом с ним флажок, возможно, для модификатора Win-Key.

person Jim McKeeth    schedule 02.12.2008
comment
Спасибо, что-то подобное я сделаю, чтобы это заработало. - person HannesNZ; 03.12.2008

ИМХО хорошо, что THotKey этого не поддерживает.

Не используйте клавишу Windows для сочетаний клавиш в вашей программе, в «Руководстве по взаимодействию с пользователем Windows Vista» говорится следующее в разделе Рекомендации — Взаимодействие — Клавиатура:

Не используйте клавишу-модификатор логотипа Windows для сочетания клавиш программы. Клавиша с логотипом Windows зарезервирована для использования в Windows. Даже если комбинация клавиш с логотипом Windows сейчас не используется Windows, она может появиться в будущем.

Даже если это сочетание клавиш не используется Windows, использование такого сочетания клавиш может ввести пользователей в заблуждение, поскольку оно будет выполнять функцию в вашей программе, в то время как другие такие сочетания клавиш, такие как Win+E или Win+R, активируют общесистемную функцию. , деактивируя вашу программу в процессе.

Изменить:

THotKey — это легкая оболочка системного элемента управления, поддерживающая только то, что поддерживает этот системный элемент управления. Не существует документированного способа установить для ярлыка что-либо, кроме модификаторов Alt, Ctrl и Shift.

Возможно, вы сможете создать собственный элемент управления для отображения ярлыков с помощью клавиши Windows и установить глобальную перехватчик клавиатуры (посмотрите на функцию API SetWindowsHookEx()).

person mghie    schedule 29.11.2008
comment
Ярлыки, которые будут использоваться, должны быть настроены пользователем, а не жестко запрограммированы. Затем они устанавливаются как глобальные ярлыки, чтобы их можно было активировать и деактивировать с помощью этого ярлыка, не активируя приложение. Это работает, но я хотел дать пользователю возможность использовать клавишу Windows. - person HannesNZ; 30.11.2008
comment
Я добавил некоторую информацию о вашем варианте использования. Вероятно, это будет много работы, не знаю, достаточно ли это важно. Конечно, существует также проблема, заключающаяся в том, что создание глобального хука может работать не для всех пользователей (отсутствуют разрешения). - person mghie; 30.11.2008

Я не знаю, сможете ли вы сделать это с компонентом THotkey.

Но вы можете захватить левый и правый ключ Windows в любом событии KeyDown, используя:

если key = vk_LWin, то showmessage('left');
если key = vk_RWin, то showmessage('right');

person lkessler    schedule 29.11.2008
comment
Лол, я как раз набирал этот ответ. У вас должна быть более быстрая клавиатура. - person Toon Krijthe; 30.11.2008

Конечно, это возможно - вам нужно сделать свою собственную копию {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;
person Tom    schedule 05.12.2008
comment
Этот код полностью не работает в международных версиях Windows. - person mghie; 28.12.2008

См. функцию RegisterHotKey в MSDN.

person liggett78    schedule 30.11.2008
comment
Хороший совет, не знала о такой функции. - person mghie; 30.11.2008
comment
Это уже то, что я использую для регистрации горячей клавиши, но чтобы получить ярлык для использования от пользователя, я использую компонент THotKey. но это тот, который не поддерживает клавишу выигрыша, а не функцию «RegisterHotKey». Я мог бы просто реализовать пользовательский ввод по-другому. - person HannesNZ; 30.11.2008