Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hot-Keys systemweit/global setzen und verwenden (https://www.delphipraxis.net/92953-hot-keys-systemweit-global-setzen-und-verwenden.html)

Relicted 29. Mai 2007 12:12


Hot-Keys systemweit/global setzen und verwenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Beitrag befindet sich jetzt hier in der Code-Library

Huhu!

Mal eine aufbereitete Komponente zu diesem Thread hier:
http://www.delphipraxis.net/internal...ct.php?t=94004


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.

Hier nochmal der quellcode der unit:

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.


Für Kritik bin ich natürlich offen :-)

Viel Spass damit.

Gruß

Reli

[edit=CalganX] Mfg, CalganX[/edit]

DeddyH 29. Mai 2007 12:23

Re: Hot-Keys systemweit/global setzen und verwenden
 
Hallo, bin ich blind oder ist FKeys vollkommen überflüssig, da ungenutzt?

Relicted 29. Mai 2007 13:02

Re: Hot-Keys systemweit/global setzen und verwenden
 
hups ja... ist noch ein fragment.. wollte eigentlich noch nen editor in die propertys reinbauen um direkt im objektinspektor die keys zu definieren..

*mal editen*

gruß
reli

Sunlight7 30. Mai 2007 00:47

Re: Hot-Keys systemweit/global setzen und verwenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!

Da mir Relicted das zugeschickt hat, da er meinen Code stibitst hat (wie er selbst sagte :lol:), hab ich mal drüber geguckt, den Fehler, der entsteht wenn mann die Komponente in mehreren Instanzen verwendet ausgebessert und eine Unregister Funktion hinzugefügt.
Dazu auch einen UserInfo Parameter zum leichteren Handeln des Events.

Als Anhang die Komponente, und ein Beispielprojekt.

Grüße, Sunlight7

Edit: Die überarbeitete Version läuft ab Delphi 2.0, die ursprüngliche ab D4 (glaub ich)

Relicted 30. Mai 2007 19:45

Re: Hot-Keys systemweit/global setzen und verwenden
 
na das klappt ja gut mit uns wir sollten ein extreme-programming team bilden :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 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