Einzelnen Beitrag anzeigen

CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Hot-Keys systemweit setzen und verwenden

  Alt 10. Jun 2007, 11:09
Relicted und Sunlight7 haben den Code noch ein wenig verbessert.
Dazu hat Relicted folgende Unit geschrieben:
Zitat:
Die Komponente handled Hotkeys und gibt sie via event ans fenster zurück. Mit der Funktion "RegisterGlobalHKey()" kann für das Programm ein Hotkey erzeugt werden. Die Parameter sind dabei:

Param fsModifiers:

MOD_ALT ALT muß gedrückt sein
MOD_CONTROL CTRL muß gedrückt sein
MOD_SHIFT SHIFT muß gedrückt sein
MOD_WIN WINDOWS-Taste muß gedrückt sein
Mehrere Modifiers werden mit "or" verknüpft.

Und Param vk:
Die Virtuellen Key Konstanten aus der Unit Windows... also VK_F9 etc.
Delphi-Quellcode:
//******************************************************************************
//* Datei: GlobalHotKey.Pas
//* Klasse: TGlobalHotKey
//* Autors: xxx ( DP: Sunlight7 )
//* Christopher Henschel ( DP: Relicted )
//* Zweck: Komponente zum setzen Globaler Hotkeys für eine
//* Anwendung
//*
//* --------------------------------------------------------------------------
//* $Date: May 29 2007 10:16:36 $
//* $Modtime: $
//* $Revision: 1.0 $
//* $Workfile: GlobalHotKey.pas $
//******************************************************************************
unit GlobalHotKey;

interface

uses
  Classes,
  Controls,
  Messages,
  Windows;

// Speicherrecord für die einzelnen Hotkeys.
type
  THotKey = record
    HotKeyVK : cardinal;
    HotKeyModifiers : cardinal;
    HotKeyID : integer;
  end;

// Event für das Formular
type
  TGlobalHotKeyPressed = procedure( fsModifiers, vk : Cardinal ) of object;

// Klasse zum Handlen der HotKey-Events
type
  TGlobalHotKey = class(TComponent)
  private
    // Counter für die HotKeyIDs
    nHotKeyID : integer;
    // Speicherarray für die HotKeys
    arHotKeys : array of THotKey;

    // Member für das OnHotKeyPressed Event
    m_pmnfHotKeyPressed : TGlobalHotKeyPressed;

    // Handle
    FWindowHandle : HWND;

    // Funktion zum setzen des OnHotKeyPressed Events.
    procedure SetHotKeyPressed( const Event : TGlobalHotKeyPressed );

  protected
    procedure WMHotKey(var Message:TMessage); message WM_HOTKEY;
  public
    // Funktion zum setzen eines neuen globalen Hotkeys.
    // vk: Virtueller Key, auf welchen reagiert werden soll.
    // z.B. : "VK_F9" für die F9 Taste.
    // fsModifiers:
    // MOD_ALT ALT muß gedrückt sein
    // MOD_CONTROL CTRL muß gedrückt sein
    // MOD_SHIFT SHIFT muß gedrückt sein
    // MOD_WIN WINDOWS-Taste muß gedrückt sein
    // Mehrere Modifiers werden mit "or" verknüpft.
    function RegisterGlobalHKey( fsModifiers, vk : Cardinal ) : boolean;

    // Destructor und Constructor...
    destructor Destroy; override;
    constructor Create(AOwner: TComponent); override;

    // Property für das Handle
    property Handle : HWND read FWindowHandle;
  published
    // Property zum setzen des OnHotKeyPressed-Events
    property OnHotKeyPressed : TGlobalHotKeyPressed read m_pmnfHotKeyPressed write SetHotKeyPressed;
  end;


// Prozedur zum registrieren der Komponente.
procedure Register;

implementation

//******************************************************************************
//* Behandelt die Registrierung der Komponente in der Reiterkarte "Zusätzlich"
//******************************************************************************
procedure Register;
begin
  RegisterComponents('Zusätzlich', [TGlobalHotKey]);
end;

//******************************************************************************
//* Behandelt die Registrierung eines Hotkeys
//******************************************************************************
function TGlobalHotKey.RegisterGlobalHKey(fsModifiers, vk : Cardinal) : boolean;
var
  bSet : boolean;
begin
  result := false;
  try
    // Hotkey registrieren
    bSet := RegisterHotKey( Self.Handle, nHotKeyID, fsModifiers, vk );

    if bSet then
    begin
      // Speicherplatz für einen neuen Hotkey erweitern
      SetLength( arHotKeys, Length(arHotKeys)+1 );

      // Hotkey Eintrag
      with arHotKeys[ Length(arHotKeys)-1 ] do
      begin
        HotKeyVK := vk;
        HotKeyModifiers := fsModifiers;
        HotKeyID := nHotKeyID;
      end;

      // Result Setzen
      result := true;

      // Die HotKeyId hochzählen...
      Inc(nHotKeyID);
    end;
  except
    //...
  end;
end;

//******************************************************************************
//* Behandelt das Event, welches ausgelöst wird wenn einer der Hotkeys gedrückt
//* wurde und sendet dieses, falls vorhanden an das Formular weiter
//******************************************************************************
procedure TGlobalHotKey.WMHotKey(var Message:TMessage);
begin
  try
    if Assigned( m_pmnfHotKeyPressed ) and ( Message.Msg = WM_HotKey ) then
      m_pmnfHotKeyPressed( Message.LParamLo, Message.LParamHi );

    Message.Result := DefWindowProc(FWindowHandle, Message.Msg, Message.wParam, Message.lParam);
  except
    //...
  end;
end;

//******************************************************************************
//* Constructor
//******************************************************************************
constructor TGlobalHotKey.Create(AOwner: TComponent);
begin
  inherited;


  // Initialisieren
  nHotKeyID := 1;
  FWindowHandle := AllocateHWND(WMHotKey);
end;

//******************************************************************************
//* Destructor
//******************************************************************************
destructor TGlobalHotKey.Destroy;
var
  i : integer;
begin
  // Hotkeys wieder unregistrieren
  for i := 0 to Length( arHotKeys ) - 1 do
    UnRegisterHotKey(Self.Handle, arHotKeys[ i ].HotKeyID);

  DeallocateHWnd(FWindowHandle);

  inherited;
end;

//******************************************************************************
//* Behandlung der Set Methode für das HotKeyEvent
//******************************************************************************
procedure TGlobalHotKey.SetHotKeyPressed(const Event: TGlobalHotKeyPressed);
begin
  m_pmnfHotKeyPressed := Event;
end;

end.
Im Anhang zu diesem Beitrag befindet sich darüber hinaus die Klasse als VCL-Komponente und ein Beispielprojekt, erstellt von Sunlight7.
Angehängte Dateien
Dateityp: zip tglobalhotkey_169.zip (3,2 KB, 156x aufgerufen)
  Mit Zitat antworten Zitat