Регистрируем горячие клавиши

Материал из DRKB

Регистрируем горячие клавиши[править | править код]

Пример демонстрирует установку горячей клавиши CTRL-F7:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure Tform1.WMHotKey(var Message: TMessage);
begin
  Application.Restore;
  Application.BringToFront;
  ShowMessage('Нажата CTRL-F7!');
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  RegisterHotKey(Form1.Handle, 123, MOD_CONTROL, VK_F7);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterHotKey(Handle, 123)
end;

end.


Source: Взято из http://forum.sources.ru
ID: 01501



{
  The following example demonstrates registering hotkeys with the
  system to globally trap keys.

  Das Folgende Beispiel zeigt, wie man Hotkeys registrieren und
  darauf reagieren kann, wenn sie gedruckt werden. (systemweit)
}

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    id1, id2, id3, id4: Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Trap Hotkey Messages
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = id1 then
    ShowMessage('Ctrl + A pressed !');
  if Msg.HotKey = id2 then
    ShowMessage('Ctrl + Alt + R pressed !');
  if Msg.HotKey = id3 then
    ShowMessage('Win + F4 pressed !');
  if Msg.HotKey = id4 then
    ShowMessage('Print Screen pressed !');
end;

procedure TForm1.FormCreate(Sender: TObject);
  // Different Constants from Windows.pas
const
  MOD_ALT = 1;
  MOD_CONTROL = 2;
  MOD_SHIFT = 4;
  MOD_WIN = 8;
  VK_A = $41;
  VK_R = $52;
  VK_F4 = $73;
begin
  // Register Hotkey Ctrl + A
  id1 := GlobalAddAtom('Hotkey1');
  RegisterHotKey(Handle, id1, MOD_CONTROL, VK_A);

  // Register Hotkey Ctrl + Alt + R
  id2 := GlobalAddAtom('Hotkey2');
  RegisterHotKey(Handle, id2, MOD_CONTROL + MOD_Alt, VK_R);

  // Register Hotkey Win + F4
  id3 := GlobalAddAtom('Hotkey3');
  RegisterHotKey(Handle, id3, MOD_WIN, VK_F4);

  // Globally trap the Windows system key "PrintScreen"
  id4 := GlobalAddAtom('Hotkey4');
  RegisterHotKey(Handle, id4, 0, VK_SNAPSHOT);
end;

// Unregister the Hotkeys
procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(Handle, id1);
  GlobalDeleteAtom(id1);
  UnRegisterHotKey(Handle, id2);
  GlobalDeleteAtom(id2);
  UnRegisterHotKey(Handle, id3);
  GlobalDeleteAtom(id3);
  UnRegisterHotKey(Handle, id4);
  GlobalDeleteAtom(id4);
end;

end.

{
  RegisterHotKey fails if the keystrokes specified for the hot key have
  already been registered by another hot key.

  Windows NT4 and Windows 2000/XP: The F12 key is reserved for use by the
  debugger at all times, so it should not be registered as a hot key. Even
  when you are not debugging an application, F12 is reserved in case a
  kernel-mode debugger or a just-in-time debugger is resident.
}


Language: en
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01502



Вот код о том как назначить горячие клавиши если даже активна другая программа. Код взят из рассылки "Мастера DELPHI. Новости мира компонент, FAQ, статьи..."


type 
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
  protected 
    procedure hotykey(var Msg: TMessage); message WM_HOTKEY; 
  end; 

var 
  Form1: TForm1; 
  id, id2: Integer; 

implementation 

{$R *.DFM} 

procedure TForm1.HotyKey(var Msg: TMessage); 
begin 
  if (Msg.LParamLo = MOD_CONTROL) and (Msg.LParamHi = 81) then 
  begin 
    ShowMessage('Ctrl + Q wurde gedrьckt !'); 
  end; 
  if (Msg.LParamLo = MOD_CONTROL) and (Msg.LParamHi = 82) then 
  begin 
    ShowMessage('Ctrl + R wurde gedrьckt !'); 
  end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  id := GlobalAddAtom('hotkey'); 
  RegisterHotKey(Handle, id, MOD_CONTROL, 81); 
  id2 := GlobalAddAtom('hotkey2'); 
  RegisterHotKey(Handle, id2, MOD_CONTROL, 82); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  UnRegisterHotKey(Handle, id); 
  UnRegisterHotKey(Handle, id2); 
end;


Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 01503