Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi dll mit hotkey... (https://www.delphipraxis.net/49560-dll-mit-hotkey.html)

Beckman 12. Jul 2005 23:56


dll mit hotkey...
 
Delphi-Quellcode:
library hotlock;

uses
  windows,
  Messages;

type
  TDummy = class
  private
    id1: Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    procedure Keybind1;
    procedure EnableHotKey;
    procedure DisableHotKey;
  end;

var
  Dummy: TDummy;

procedure TDummy.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = id1 then
    Dummy.Keybind1;
end;

procedure TDummy.Keybind1;
begin
MessageBox(0, 'KEYBIND1 was captured', 'SUCCESS!', 0);
dummy.DisableHotKey;
//dummy.Free;
end;

procedure TDummy.EnableHotKey;
begin
//Globally trap the Windows system key "PrintScreen"
id1 := GlobalAddAtom('Hotkey1');
RegisterHotKey(0, id1, 0, VK_SNAPSHOT);
end;

procedure TDummy.DisableHotKey;
begin
//Unregister the Hotkey
UnRegisterHotKey(0, id1);
GlobalDeleteAtom(id1);
end;

begin
Dummy := Tdummy.Create;
Dummy.EnableHotKey;
end.


die dll soll beim 'geladen werden' den gegebenen hotkey registrieren.
das alles funkt ja schoen und gut mit den atoms. und es funkt auch normaler weise in ner normalen app systemweit.
das einzige prob ist nur, dass diese dll ueber den WM_HOTKEY scheinbar net informiert wird oder sowas.

weiss hier einer rat?

Luckie 13. Jul 2005 00:12

Re: dll mit hotkey...
 
Wie hats du dir denn vorgestellt, dass die Nachricht WM_HOTKEY in deiner DLL ankommen soll? Zu erst einmal bekommt die Naschricht das fenster, was einen HotKey registriert hat über die MessageLoop. Von dort wird sie an die FensterProzedur weitergegeben, die dort angegeben ist. Wie soll jetzt also deine DLL die Nachrciht bekommen?

Beckman 13. Jul 2005 00:20

Re: dll mit hotkey...
 
Delphi-Quellcode:
library hotlock;

uses
  windows,
  Messages,
  SysUtils;

type
  TDummy = class
  private
    id1: Integer;
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    procedure Keybind1;
    procedure EnableHotKey;
    procedure DisableHotKey;
  end;

var
  Dummy: TDummy;
  Msg: TMsg;

procedure TDummy.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = id1 then
    Dummy.Keybind1;
end;

procedure TDummy.Keybind1;
begin
MessageBox(0, 'KEYBIND1 was captured', 'SUCCESS!', 0);
end;

procedure TDummy.EnableHotKey;
begin
//Globally trap the Windows system key "PrintScreen"
id1 := GlobalAddAtom('Hotkey1');
RegisterHotKey(0, id1, 0, VK_END);
end;

procedure TDummy.DisableHotKey;
begin
//Unregister the Hotkey
UnRegisterHotKey(0, id1);
GlobalDeleteAtom(id1);
end;

begin
Dummy := Tdummy.Create;
Dummy.EnableHotKey;

while GetMessage(Msg, 0, 0, 0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
  end;

dummy.DisableHotKey;
dummy.Free;

{
while GlobalFindAtom('Hotkey1') <> 0 do
  GlobalDeleteAtom(GlobalFindAtom('Hotkey1'));
}
end.


so, aber die host app wird eingefrorren.
obwohl der hotkey funken muss, weil er net mehr im explorer zb funkt.


//edit:
globalkeyhook ist mein freund :)
da das ganze ja ne 'dll' ist. mal sehen, was meister google und meister forensuche mir verraten :)

Olli 13. Jul 2005 09:14

Re: dll mit hotkey...
 
Grundsätzlich: Keine DLL kann einen Hotkey registrieren. Jetzt meinst du vielleicht: "Bei mir geht's doch."! Falsch! Du schließt Falsches aus deiner Beobachtung. Ein Hotkey wird immer für ein Fenster registriert, oder alternativ für den aufrufenden (also meistens wahrscheinlich den Haupt-) Thread der Anwendung. Damit ist klar, wo die WM_HOTKEY-Nachricht bearbeitet werden muß, denn grundsätzlich gibt es nur eine Nachrichtenschleife pro Thread!

Ein Vorschlag von mir wäre, daß du der Anwendung selber eine Bearbeitung für WM_HOTKEY verpaßt, in der du eine Callback-Funktion aufrufst, welche ja dann wiederum in der DLL enthalten sein kann.

DP-Maintenance 13. Jul 2005 09:23

DP-Maintenance
 
Dieses Thema wurde von "sakura" von "Sonstige Fragen zu Delphi" nach "Windows API / MS.NET Framework API" verschoben.

Beckman 13. Jul 2005 09:32

Re: dll mit hotkey...
 
jo. ne. das ding wird injected in die host app. die kann ich net bearbeiten...

aber ich kaempf grad gegen text salate wegen den dll/hooks. ich braeuchte ja thoeretisch nur sonen keyboard/hook, was mir im moment noch net gelingt... die meisten codes, die ich finde, versteh ich noch net, aber heute bin ich noch optimistisch :)

Olli 13. Jul 2005 09:40

Re: dll mit hotkey...
 
Zitat:

Zitat von Beckman
jo. ne. das ding wird injected in die host app. die kann ich net bearbeiten...

Aber hallo? Was machst du denn? Etwa kein Fenster angeben? Dann wird's tatsächlich kompliziert. Aber wenn du ein Fenster angibst, kannst du es subclassen und dann selber in der DLL die Bearbeitung übernehmen. Wüßte nicht wo da das Problem sein sollte.

Zitat:

Zitat von Beckman
aber ich kaempf grad gegen text salate wegen den dll/hooks. ich braeuchte ja thoeretisch nur sonen keyboard/hook, was mir im moment noch net gelingt... die meisten codes, die ich finde, versteh ich noch net, aber heute bin ich noch optimistisch :)

Dazu habe ich ein Tutorial geschrieben:
http://assarbad.net/en/stuff/tutorials/hooks/

Über Feedback (was ist unverständlich usw.) freue ich mich natürlich (am besten direkt in meinem Forum).
Allerdings vermute ich, daß ein Hook hier Overkill ist, es sei denn du arbeitest fensterlos!

NicoDE 13. Jul 2005 10:40

Re: dll mit hotkey...
 
Mit Kanonen auf Spatzen...
Du brauchst keinen Dummy-Hook, sondern nur ein Fenster(thread) in deiner DLL. Beispiele gibt es sicher genug im Forum. Und selbst wenn nicht, scheibe an welcher Stelle Du nicht weiter kommst...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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