AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Hot-Keys systemweit/global setzen und verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

Hot-Keys systemweit/global setzen und verwenden

Ein Thema von Relicted · begonnen am 29. Mai 2007 · letzter Beitrag vom 30. Mai 2007
Thema geschlossen
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#1

Hot-Keys systemweit/global setzen und verwenden

  Alt 29. Mai 2007, 12:12
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]
Angehängte Dateien
Dateityp: zip globalhotkey_954.zip (4,6 KB, 17x aufgerufen)
 
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Hot-Keys systemweit/global setzen und verwenden

  Alt 29. Mai 2007, 12:23
Hallo, bin ich blind oder ist FKeys vollkommen überflüssig, da ungenutzt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
 
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Hot-Keys systemweit/global setzen und verwenden

  Alt 29. Mai 2007, 13:02
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
 
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#4

Re: Hot-Keys systemweit/global setzen und verwenden

  Alt 30. Mai 2007, 00:47
Moin!

Da mir Relicted das zugeschickt hat, da er meinen Code stibitst hat (wie er selbst sagte ), 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)
Angehängte Dateien
Dateityp: zip tglobalhotkey_847.zip (3,2 KB, 36x aufgerufen)
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
 
Relicted

Registriert seit: 24. Jan 2006
Ort: Iserlohn
646 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Hot-Keys systemweit/global setzen und verwenden

  Alt 30. Mai 2007, 19:45
na das klappt ja gut mit uns wir sollten ein extreme-programming team bilden
 
Thema geschlossen


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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