Einzelnen Beitrag anzeigen

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