AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Windows API / MS.NET Framework API Delphi Hot-Keys systemweit setzen und verwenden
Thema durchsuchen
Ansicht
Themen-Optionen

Hot-Keys systemweit setzen und verwenden

Ein Thema von Sunlight7 · begonnen am 7. Okt 2006 · letzter Beitrag vom 10. Jun 2007
Antwort Antwort
Benutzerbild von Sunlight7
Sunlight7

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

Hot-Keys systemweit setzen und verwenden

  Alt 7. Okt 2006, 14:20
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

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

Stichwort für Suche: Globale Hotkeys

[edit=CalganX]Titel, Klassifizierung. Mfg, CalganX[/edit]
[edit=SirThornberry]Stichwort auf Wunsch hinzugefügt - Mfg, SirThornberry[/edit]
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Systemweite Hot-Key's einrichten

  Alt 3. Feb 2007, 19:06
Eine kleine Anmerkung noch:
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:
RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT or MOD_ALT, VK_F1); Wenn keine Umschalttaste gedrückt werden muss, einfach 0 einsetzen:
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?
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Hot-Keys systemweit setzen und verwenden

  Alt 29. Mai 2007, 05:50
Die Registrierung schlägt fehl, sobald irgendein Programm oder Windows den Hot-Key bereits verwendet.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
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, 10: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, 155x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort

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 14:50 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