AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Globaler Tastatur-Hook tuts nur halb
Thema durchsuchen
Ansicht
Themen-Optionen

Globaler Tastatur-Hook tuts nur halb

Ein Thema von Medium · begonnen am 20. Aug 2008 · letzter Beitrag vom 24. Aug 2008
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#1

Globaler Tastatur-Hook tuts nur halb

  Alt 20. Aug 2008, 04:58
Aloah zusammen. Ich habe auf Basis von Ollis Tutorial eine DLL für einen globalen Tastatur-Hook zusammengeschustert, und das funktioniert leider nur "halb". Es geht, so lange ich nur meine Hostanwendung gestartet habe und nichts weiter mache. Verliert diese aber einmal den Fokus, ists vorbei. Selbst wenn ich der Anwendung den Fokus wieder gebe.
Ich stelle einfach mal den DLL Code ein, er ist kurz genug. Da dies mein erster Einsatz von Hooks ist, bin ich da etwas unbeholfen. Dem msdn nach schauen die Aufrufe für mich soweit okay aus, ich weiss nichtmal mehr wonach ich schauen müsste.

Delphi-Quellcode:
library Hooks;

uses
  Windows, Messages, SysUtils;

var
  Keyboard_HookHandle: HHOOK = 0;

function KbdHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(Keyboard_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    True: Exit;
    False:
    begin
      if wParam in [ord('a')..ord('z'), ord('A')..ord('Z'), ord('0')..ord('9')] then Beep;
    end;
  end;
end;

function InstallHooks: Boolean; stdcall;
var
  keybh: boolean;
begin
  keybh := false;
  if Keyboard_HookHandle = 0 then
  begin
    Keyboard_HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KbdHookProc, hInstance, 0);
    keybh := Keyboard_HookHandle <> 0;
  end;
  Result := keybh;
end;

function UninstallHooks: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(Keyboard_HookHandle);
  Keyboard_HookHandle := 0;
end;

procedure DLLMain(dwReason: DWord);
begin
end;

exports
  InstallHooks,
  UninstallHooks;

begin
end.
Die Hostanwendung ist einfach eine normale automatisch erzeugte Standard-Delphi-Start-Anwendung, bei der ich im OnFormCreate "InstallHooks", und im OnFormClose "UninstallHooks" aufrufe (statische Bindung). Warum verliere ich den Hook?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Globaler Tastatur-Hook tuts nur halb

  Alt 21. Aug 2008, 14:11
Ich muss den Thread leider nochmal hoch holen . Ich kann bei meinen Suchen irgendwie immer nur Gebrabbel der Art "ja, das geht z.B. mit nem Hook" finden, aber selten auch mal praktische Beispiele, und diese meist dann auch noch in Bruchstücken oder gar gänzlich falsch. Ist dieses Thema so ein Mysterium? Es muss doch jemanden geben, der sich damit auskennt - auch ohne Gelbe Seiten
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Globaler Tastatur-Hook tuts nur halb

  Alt 24. Aug 2008, 06:13
Okay, ein letzter Versuch doch noch jemand wissenden hier zu finden , aber mit erweiterter Fragestellung: Falls sich für o.g. Problem keine Lösung findet, gibt es einen guten Grund dafür nicht sämtliche alphanumerische Tasten incl. Enter, Backspace, Space usw. als systemweiten Hotkey zu definieren? Das wäre jetzt die Notlösung die mir als einzige einfiele
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
r29d43

Registriert seit: 18. Jan 2007
287 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Globaler Tastatur-Hook tuts nur halb

  Alt 24. Aug 2008, 08:34
Dein globaler Hook sieht da wirklich etwas sehr dünn aus. Irgendwie fehlt da auch das bei globalen Hooks wichtige Memory-Mapping. Einen funktionierenden globalen Hook siehst du z.B. auch hier.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Globaler Tastatur-Hook tuts nur halb

  Alt 24. Aug 2008, 23:06
Ich hab das Mapping bzw. sonstige IPC immer nur als Möglichkeit verstanden vom Hook aus eine Aktion in einem eigenen Programm auszulösen. Danke dir für den Stubs auf den Thread! Ich schau mal was da anders ist, und ob ich das mit dessen Hilfe endlich hin bekomme!

Edit: Ich hab nun die DLL aus dem Thread genommen, und spaßeshalbar mal das Mapping komplett raus genommen, inc. des Benachrichtigens eines Programmes usw. - kurzum: Es schaut jetzt wieder fast genau so aus wie das da oben, aber es geht . Das muss diese Compilermagic sein von der immer alle reden ^^

Edit2: Oooookay. Der Code oben von mir tut es doch tatsächlich auch. Ich hab in der letzten Zeit nun auch meinen PC mal neu gestartet, was hier wohl offenbar als die Problemlösung gesehen werden muss. Wenn nix tut, dann boot. Da hätte ich eigentlich drauf kommen müssen. Danke dennoch an alle Leser und den Schreiber
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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 05:52 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