THotkey с поддержкой win-key? - PullRequest
       14

THotkey с поддержкой win-key?

3 голосов
/ 29 ноября 2008

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

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

Спасибо, куча!

Ответы [ 5 ]

8 голосов
/ 30 ноября 2008

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

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

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

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

Изменить:

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

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

3 голосов
/ 05 декабря 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;
3 голосов
/ 30 ноября 2008

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

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

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

2 голосов
/ 30 ноября 2008
1 голос
/ 02 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...