AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hotkeyunit - Message auslagern

Ein Thema von xZise · begonnen am 26. Apr 2007 · letzter Beitrag vom 1. Mai 2007
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Hotkeyunit - Message auslagern

  Alt 26. Apr 2007, 18:12
Ich habe eine Objekt dami ich einfach Hotkeys erstellen kann. Nur werden die Hotkeys nicht erfasst... Wie könnte ich sozusagen die Messages des Mutterprogramms abfragen?
Delphi-Quellcode:
type
  EFailedRegisterHotkey = class(Exception);
  EAlreadyExists = class(Exception);

   THotkeyEvent = procedure (ID : Integer) of object;

   THotkeySet = record
    Hotkey : TShortcut;
    Init : Boolean;
    ID : Word;
  end;

  THotKeyFrontEnd = class(TObject)
  private
     FHandle : THandle;
    FHotkeys : array of THotkeySet;
    FOnHotkey: THotkeyEvent;
    function GetHotkeys(index: Integer): THotkeySet;
      procedure ShortCutToHotKey(HotKey: TShortCut; var Key : Word; var Modifiers: Cardinal);
  public
    property Hotkeys[index : Integer] : THotkeySet read GetHotkeys;
    property OnHotkey : THotkeyEvent read FOnHotkey write FOnHotkey;

    procedure RegisterHotkey(AHotkey : TShortCut);
    procedure ChangeHotkey(index : Integer; ANewHotkey : TShortCut);
    function HotkeysCount : Integer;

    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;

    constructor Create(AHandle : THandle);
     destructor Destroy; override;
  end;

implementation

{ THotKeyFrontEnd }

procedure THotKeyFrontEnd.ShortCutToHotKey(HotKey: TShortCut; var Key : Word; var Modifiers: Cardinal);
var
  Shift: TShiftState;
begin
  ShortCutToKey(HotKey, Key, Shift);
  Modifiers := 0;
  if (ssShift in Shift) then
    Modifiers := Modifiers or MOD_SHIFT;
  if (ssAlt in Shift) then
    Modifiers := Modifiers or MOD_ALT;
  if (ssCtrl in Shift) then
    Modifiers := Modifiers or MOD_CONTROL;
end;

procedure THotKeyFrontEnd.WMHotKey(var Msg: TWMHotKey);
var
   i : Integer;
begin
   for i := 0 to High(FHotkeys) do
  begin
    if Msg.Msg = FHotkeys[i].ID then
    begin
      if Assigned(FOnHotkey) then
        FOnHotkey(i);
    end;
  end;
end;

procedure THotKeyFrontEnd.ChangeHotkey(index: Integer; ANewHotkey: TShortCut);
var
  key : Word;
  Modifiers : Cardinal;
  b : THotkeySet;
begin
   if (index >= 0) and (index < Length(FHotkeys)) then
  begin
     b := FHotkeys[index];
    if b.Hotkey <> ANewHotkey then
    begin
       b.Hotkey := ANewHotkey;
      if b.init then begin
        UnRegisterHotKey(FHandle, b.ID);
        GlobalDeleteAtom(b.ID);
      end;
      ShortCutToHotKey(ANewHotkey, Key, Modifiers);
      b.ID := GlobalAddAtom(PChar('hk' + IntToStr(index)));
      if not Windows.RegisterHotKey(FHandle, b.ID, Modifiers, Key) then begin
        b.init := false;
        raise EFailedRegisterHotkey.CreateFmt(FAILED_REGISTER_HOTKEY, [ShortCutToText(ANewHotkey)]);
      end else
        b.init := true;
    end else
       raise EAlreadyExists.CreateFmt(ALREADY_EXISTS, [ShortCutToText(ANewHotkey)]);
  end;
end;

constructor THotKeyFrontEnd.Create(AHandle: THandle);
begin
   inherited Create;
  FHandle := AHandle;
end;

destructor THotKeyFrontEnd.Destroy;
var
   i : Word;
begin
  for i := 1 to High(FHotkeys) do
  begin
    if FHotkeys[i].init then begin
      UnRegisterHotKey(FHandle, FHotkeys[i].ID);
      GlobalDeleteAtom(FHotkeys[i].ID);
    end;
  end;
  inherited;
end;

function THotKeyFrontEnd.GetHotkeys(index: Integer): THotkeySet;
begin
   Result := FHotkeys[index];
end;

function THotKeyFrontEnd.HotkeysCount: Integer;
begin
  Result := Length(FHotkeys);
end;

procedure THotKeyFrontEnd.RegisterHotkey(AHotkey: TShortCut);
var
   i : Integer;
  key : Word;
  Modifiers : Cardinal;
  b : THotkeySet;
begin
   for i := 1 to High(FHotkeys) do begin
    if FHotkeys[i].Hotkey = AHotkey then
    begin
       raise EAlreadyExists.CreateFmt(ALREADY_EXISTS, [ShortCutToText(AHotkey)]);
    end;
  end;
  SetLength(FHotkeys, Length(FHotkeys) + 1);
  b := FHotkeys[High(FHotkeys)];
  b.Hotkey := AHotkey;

  ShortCutToHotKey(AHotkey, Key, Modifiers);
  b.ID := GlobalAddAtom(PChar('hk' + IntToStr(Length(FHotkeys))));
  if not Windows.RegisterHotKey(FHandle, b.ID, Modifiers, Key) then begin
    b.init := false;
    raise EFailedRegisterHotkey.CreateFmt(FAILED_REGISTER_HOTKEY, [ShortCutToText(AHotkey)]);
  end else
    b.init := true;
end;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 18:06
Hat keiner eine einigermaßen vernünftige Lösung?
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  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: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 19:45
Die vernünftigste Lösung ist es nicht ein Handle übergeben zu bekommen sondern mit AllocateHwnd selbst ein Fensterhandle zu erstellen wozu du die Messageprocedure bestimmen kannst und somit auch die Messages auswerten kannst.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 20:08
Zitat von SirThornberry:
Die vernünftigste Lösung ist es nicht ein Handle übergeben zu bekommen sondern mit AllocateHwnd selbst ein Fensterhandle zu erstellen wozu du die Messageprocedure bestimmen kannst und somit auch die Messages auswerten kannst.
Und wie komm ich dann an die Messages?
[edit]Und wie soll AllocateHWnd funktionieren? Ich mein, wozu brauch ich ein neues Fenster?[/edit]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 20:09
Hast du dir AllocateHwnd überhaupt schon mal angeschaut? Mir scheint dem nicht so zu sein. Der Funktion musst du als Parameter übergeben an welche MessageMethode die Messages gesendet werden. Und eben in dieser kannst du dann die Messages auswerten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 20:12
D.h. ich erstelle mir ein neues nicht sichtbares Fenster... Wird dass denn auch dem Programm zugeordnet? Und was bringt mir das HWnd was ich wiederbekomme? Brauch ich dass nur zum "freigeben"?

[edit]Manomann... hab doof reagiert... sry... Aber eine Frage: Ich habe jetzt diese Prozedur... Aber wie komme ich jetzt daran. Ob ein Hotkey ausgelöst wurde?
Ich habe das bisher so:
Delphi-Quellcode:
constructor THotKeyFrontEnd.Create;
begin
  inherited;
  hwnd := AllocateHWnd(HWndProc);
end;

procedure THotKeyFrontEnd.HWndProc(var Message: TMessage);
begin
  if Message.Msg = WM_HotKey then
  begin

  end;
end;
So compiliert er, aber das kanns ja net sein, oder wie komme ich an die Hotkeyid?[/edit]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 20:38
Laut MSDN liefert Message.wparam die ID des Hotkeys.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Hotkeyunit - Message auslagern

  Alt 1. Mai 2007, 21:06
Ah danke ! Jetzt funktionierts!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  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 23:32 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