Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Windows API / MS.NET Framework API (https://www.delphipraxis.net/20-library-windows-api-ms-net-framework-api/)
-   -   Delphi Hot-Keys systemweit setzen und verwenden (https://www.delphipraxis.net/78591-hot-keys-systemweit-setzen-und-verwenden.html)

Sunlight7 7. Okt 2006 14:20


Hot-Keys systemweit setzen und verwenden
 
Hallo!

Heiße Tasten - Aus einer Frage heraus habe ich festgestellt, das es hier noch kein Beispiel für Systemweite Hot-Key's gibt.
Also wird's Zeit dafür :wink:

Delphi-Quellcode:
///////////////////////////////////////////
// Beispiel: Shift F1 als Hot-Key setzen //
///////////////////////////////////////////

// Infos zu den Paramater
// 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

unit HotKeyForm;

interface

uses
  ...

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender:TObject);
  private
    { Private-Deklarationen }
    HotKeySet:Boolean;
  protected
    { Protected-Deklarationen }
    procedure WMHotKey(var Message:TMessage); message WM_HOTKEY;
    ...
  end;

var
  Form1: TForm1;

implementation

{$*.dfm}

const
  HotKeyID=1;
 
procedure TForm1.FormCreate(Sender:TObject);
begin
   HotKeySet:=RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT, VK_F1);
   If not HotKeySet then
      ShowMessage('Hot-Key konnte nicht gesetzt werden:'#13+SysErrorMessage(GetLastError));
end;

procedure TForm1.FormDestroy(Sender:TObject);
begin
   // Nur UnregisterHotKey aufrufen wenn HotKeySet True ist!
   If HotKeySet then // <- Und den Fehler hat keiner gesehen :) Da war ein not drin
      UnRegisterHotKey(Self.Handle, HotKeyID);
end;

procedure TForm1.WMHotKey(var Message:TMessage);
begin
   If Message.wParam=HotKeyID then
      ShowMessage('Hot-Key "Shift F1" funktioniert!');
end;
Aber nicht das Ihr jetzt alle Programme mit Sinnlosen Hot-Key's zupflanzt :wink:

Stichwort für Suche: Globale Hotkeys

[edit=CalganX]Titel, Klassifizierung. Mfg, CalganX[/edit]
[edit=SirThornberry]Stichwort auf Wunsch hinzugefügt - Mfg, SirThornberry[/edit]

Martin K 3. Feb 2007 19:06

Re: Systemweite Hot-Key's einrichten
 
Eine kleine Anmerkung noch:
Zitat:

Zitat von Sunlight7
Delphi-Quellcode:
// Infos zu den Paramater
// 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

Wenn mehrere Umschalttasten gleichzeitig gedrückt sein sollen, müssen diese mit or verknüpft werden, das machen besonders Anfänger gerne falsch:
Delphi-Quellcode:
RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT or MOD_ALT, VK_F1);
Wenn keine Umschalttaste gedrückt werden muss, einfach 0 einsetzen:
Delphi-Quellcode:
RegisterHotKey(Self.Handle, HotKeyID, 0, VK_F1);

Dann hab ich nochmal eine Frage zur HotKeyID:
Kann die Registrierung eines HotKeys auch fehlschlagen, wenn ein anderes Programm bereits einen HotKey mit dieser Zahl (HotKeyID) festgelegt hat, oder kann die Funktion nur Fehlschlagen, wenn die Tastenkombination bereits vergeben ist?

SirThornberry 29. Mai 2007 05:50

Re: Hot-Keys systemweit setzen und verwenden
 
Die Registrierung schlägt fehl, sobald irgendein Programm oder Windows den Hot-Key bereits verwendet.

CalganX 10. Jun 2007 10:09

Re: Hot-Keys systemweit setzen und verwenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz