AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Diese Sache mit den globalen Hooks...
Thema durchsuchen
Ansicht
Themen-Optionen

Diese Sache mit den globalen Hooks...

Ein Thema von CalganX · begonnen am 30. Sep 2005 · letzter Beitrag vom 1. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
CalganX

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

Diese Sache mit den globalen Hooks...

  Alt 30. Sep 2005, 23:12
Hi,
ich wollte jetzt in eines meiner Programme einen systemweiten Hotkey einbinden. Folglich also einen globalen Hook. Soweit so gut.

Ich habe mir das Tutorial von Olli mal angesehen (leider ist natürlich genau jetzt der Server down -.-), aber irgendwie ist mir da noch was nicht ganz schleierhaft...
Zum Beispiel habe ich in der Doku nirgendwo einen Hinweis darauf gefunden, wie welche Tasten als Hook registriert werden.

Kann vielleicht jemand kurz und pregnant umreißen wie das mit den Hooks funktioniert? Ich würde gerne so wenig Aufwand wie möglich darein investieren, da mein Programm nicht nur aus Hooks besteht. *g*

Danke für jede Hilfe,
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Diese Sache mit den globalen Hooks...

  Alt 30. Sep 2005, 23:34
Zitat von Chakotay1308:
Hi,
ich wollte jetzt in eines meiner Programme einen systemweiten Hotkey einbinden. Folglich also einen globalen Hook.
Hotkeys und Hooks haben so erst einmal nichts miteinander zu tun. Einen Hotkey kannst du z.B. für eine Verknüpfung im Startmenü anlegen, indem du unter Eigenschaften dafür eine Tastenkombination hinterlegst.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
CalganX

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

Re: Diese Sache mit den globalen Hooks...

  Alt 30. Sep 2005, 23:39
Hi Volker,
huch... wusste nichtmal, dass es sowas gibt.

Aber was ich meine sind defintiv Hooks. Habs ja nochmal erklärt: Tastenkombination im Laufenden Programm soll einfach mein Programm benachrichtigen. Hook.

Chris
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 10:52
Moin Chris,

Zitat von Chakotay1308:
Aber was ich meine sind defintiv Hooks. Habs ja nochmal erklärt: Tastenkombination im Laufenden Programm soll einfach mein Programm benachrichtigen. Hook.
Du willst also nur eine bestimmte Kombo abfangen? In diesem Falle solltest du entsprechend ein case-Statement einfügen und dort auf die von dir gewünschten virtuellen Tastencodes testen, denke ich. Oder habe ich da wieder was mißverstanden. Zeige mal, welchen Code du bisher hast.

Jaja, das Tut schreit förmlich nach einer Aktualisierung
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#5

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 11:40
Ist mir bei der Problembeschreibung irgendwas entgangen, oder wird MSDN-Library durchsuchenRegisterHotKey nicht mehr gern gesehen?

Edit: Register heeßt des Teil
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 11:43
dafür muss man doch nicht gleich einen Hook nehmen, schließlich gibt es dafür "RegisterHotKey"
[Edit]Na toll, da war der rote Kasten mal nicht da[/Edit]
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
 
#7

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 13:08
Hi,
@Olli: An Code für einen Hook habe ich bisher noch gar nichts.

@tommie und Thornberry: ja, das klingt gut, danke! Aber irgendwie funktioniert das noch nicht so ganz...
Habe mir auf die Schnelle das schnell in eine Klasse gepackt:
Delphi-Quellcode:
unit uGlobalHotKey;

interface

uses
  Windows, Classes, Forms, Menus, Messages;

type
  TGlobalHotKey = class(TObject)
  private
    FHotKey: TShortCut;
    FOnHotKey: TNotifyEvent;

  protected
    procedure WMHotKey(var msg: TMessage); message WM_HOTKEY;

  public
    constructor Create;
    destructor Destroy; override;

    function RegisterKey: boolean;
    function UnregisterKey: boolean;

  published
    property HotKey: TShortCut read FHotKey write FHotKey;
    property OnHotKey: TNotifyEvent read FOnHotKey write FOnHotKey;

  end;

implementation

{ TGlobalHotKey }

constructor TGlobalHotKey.Create;
begin
  inherited;

  // Nothing to do
end;

destructor TGlobalHotKey.Destroy;
begin
  // Hotkey wieder freigeben
  UnregisterKey;

  inherited;
end;

function TGlobalHotKey.RegisterKey: boolean;
var
  uModifier, uKey: Word;
  sShiftState: TShiftState;
begin
  Result := false;

  // Kombination zugewiesen?
  if FHotKey = 0 then Exit;

  // Kombination entschlüsseln
  ShortCutToKey(FHotKey, uKey, sShiftState);

  uKey := Ord('A');

  // Modifier-Key rausfinden
  uModifier := 0;
  if ssAlt in sShiftState then
    uModifier := uModifier or MOD_ALT;
  if ssCtrl in sShiftState then
    uModifier := uModifier or MOD_CONTROL;
  if ssShift in sShiftState then
    uModifier := uModifier or MOD_SHIFT;

  // Kombination registrieren
  Result := RegisterHotKey(Application.Handle, $BFFF, uModifier, uKey);
end;

function TGlobalHotKey.UnregisterKey: boolean;
begin
  // HotKey deregistrieren
  Result := UnregisterHotKey(Application.Handle, $BFFF);
end;

procedure TGlobalHotKey.WMHotKey(var msg: TMessage);
begin
  // Nachricht erhalten und Event auslösen
  if Assigned(FOnHotKey) then
    FOnHotKey(self);
end;

end.
Nun wird allerdings mein Ereignis nie ausgelöst. Und auch wenn ich über Application.OnMessage versuche die Nachricht WM_HOTKEY abzufangen warte ich relativ ewig... Habe schon geguckt... rein theoretisch müsste es funktioniert (Einzelschritt sagt mir, dass [CTRL]+[ALT]+[A] registriert wurde).

Habt ihr eine Idee?

Chris
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 13:18
wenn du die Message auf diese Weise
 procedure WMHotKey(var msg: TMessage); message WM_HOTKEY; abfangen willst so muss die klasse auch ein Handle haben um die message auch empfangen zu können und dementsprechend müsstest du dann bei RegisterHotkey das Handle dieser Klasse angeben
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
 
#9

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 13:26
Hi,
hm. Das habe ich mir gedacht, deswegen habe ich ja nochmal per Application.OnMessage versucht abzufangen (gebe ja auch das Handle der Anwendung weiter). Aber das hat ja auch nicht funktioniert...

Chris
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Diese Sache mit den globalen Hooks...

  Alt 1. Okt 2005, 13:53
so gehts
Delphi-Quellcode:
  THotkeyObj = class(TObject)
  private
    fHandle: Cardinal;
    procedure FMsgProc(var AMsg: TMessage);
  public
    constructor Create;
    destructor Destroy; override;
  end;
[...]
constructor THotkeyObj.Create;
begin
  inherited;
  fHandle := classes.AllocateHWnd(FMsgProc);
  RegisterHotKey(fHandle, 0, MOD_CONTROL, VKKeyScan('a'));
end;

destructor THotkeyObj.Destroy;
begin
  UnregisterHotKey(fHandle, $0);
  classes.DeallocateHWnd(fHandle);
  inherited;
end;

procedure THotkeyObj.FMsgProc(var AMsg: TMessage);
begin
  with AMsg do
  begin
    if AMsg.Msg = WM_HOTKEY then
      //hotkey was pressed
    else
      Result := DefWindowProc(fHandle, Msg, wParam, lParam);
  end;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:20 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