AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Mausrad abfangen - drehung außerhalb der anwendung erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

Mausrad abfangen - drehung außerhalb der anwendung erkennen

Ein Thema von SuperDaniel · begonnen am 17. Dez 2006 · letzter Beitrag vom 5. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
SuperDaniel

Registriert seit: 10. Jul 2004
6 Beiträge
 
#1

Mausrad abfangen - drehung außerhalb der anwendung erkennen

  Alt 17. Dez 2006, 20:27
hi, kann mir jemand sagen wie ich außerhalb meiner anwendung erkennen kann ob das mausrad gedreht wurde, es ist egal welche richtung oder so, ich muss nur erkennen das es gedreht wurde, möchte nämlich in einem spielen das rad drehen und dann soll mein programm ein tasten befehl senden

ich hahe absolut keine ahnung wie das geht
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 19. Dez 2006, 01:19
Lies dir mein Hooktutorial durch und les dich in Luckies Win32-Tuts schlau.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#3

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 19. Dez 2006, 13:47
Hallo,

ich habe hier mal ein Code für dich:
Delphi-Quellcode:
private
  i: Integer;
  MouseHook: HHOOK;
.
.

{--[MouseHookProc]-------------------------------------------------------------}

function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  If nCode = HC_ACTION then
   begin
    If lParam <> 0 then with PEventMsg(lParam)^ do
     begin
      If Message = WM_MOUSEWHEEL then
       begin
        Inc(Form1.i);
        Form1.Label1.Caption := IntToStr(Form1.i);
       end;
     end;
   end;
  Result := CallNextHookEx(Form1.MouseHook, nCode, wParam, lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  i := 0;
  Form1.MouseHook := SetWindowsHookEx(WH_JOURNALRECORD, @MouseHookProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  If Form1.MouseHook <> 0 then
   begin
    UnhookWindowsHookEx(Form1.MouseHook);
    Form1.MouseHook := 0;
   end;
end;
In einigen Prozeduren wird eine dll ausgelagert, hiermit nicht.

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 19. Dez 2006, 14:06
Da der Hook nicht in einer DLL steckt, wird es nicht systemweit funktionieren, sondern nur im eigenen Prozess. Es sol aber systemweit funktionieren. Ergo ist es zwingend erforderlich, dass der Hook in eine DLL ausgelagert wird, die dann in jeden Prozess injiziert wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 19. Dez 2006, 14:09
Aber das ist doch ein hardware-Hook. Warum soll der in alle Anwendungen rein?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 19. Dez 2006, 14:11
Verhält sich das bei Hardware Hooks nicht so? Also einen Keyboard Hook musst du auch in alle Prozesse injizieren, wenn du von allen Prozessen die Tatstauranschläge bekommen willst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#7

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 19. Dez 2006, 15:06
Hallo,

@Lucky, was meinst du mit eigenem Prozess? Wenn du den Code testest, siehst du dass er auch außerhalb der eigenen Anwendung funktioniert. Ich weis nicht ob das der beste Weg ist aber den Code hab ich einem meiner Programm drinn, welches über einen Klick auf ein Fenstertitel dieses Fenster durchsichtig macht. Dazu war auch ein Hook notwenig.

Und noch was: Warum ist das ein HardwareHook? was bedeutet das?

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 20. Dez 2006, 02:24
Hardware-Hook ist technisches Blabla. Sowas gibt es nicht! Als ob man vom Usermode direkt auf Hardware zugreifen könnte.

Der Journal-Hook ist etwas spezifisches (wird zB für Anwendungen für Behinderte benutzt). In der Doku steht auch eindeutig:

Zitat:
A JournalRecordProc hook procedure does not need to live in a dynamic-link library. A JournalRecordProc hook procedure can live in the application itself.
... wobei der Typ immer "globaler Hook" ist. Ist also alles im grünen Bereich
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 20. Dez 2006, 07:27
Mir ist nicht bekannt, das die DLL in jeden Prozess injiziert werden muss. Es ist aber so, das (nach meinem Halbwissen) Windows es nicht zulässt, das eine EXE einen globalen Hook einrichtet, denn wenn die EXE wegballert, ohne den Hook wegzunehmen, schießt sich dadurch Windows ab.

Also hat MS sich gedacht: Globale Hooks nur in DLL. Du schreibst also eine kleine Hook-DLL, lädst die permanent und initialisierst aus dem DLL-Code heraus den Hook. Nun sieht Windows, das der Hook aus eine DLL zeigt und die Welt ist in Ordnung, denn Windows kontrolliert, wann die DLL wieder aus dem Speicher verschwindet. Über ein Callback realisierst Du die Benachrichtigung, das etwas passiert ist.

Ich denke mal, das meint Luckie et al. mit 'injizieren', oder? Leider finde ich meine DLL nicht mehr, die das so gemacht hat. Ich weiss nur noch, das man den DLL-Initialisierungscode (DllMain) selbst schreiben muss, damit das klappt.

Das hier hab ich bei torry gefunden. Ich habe es nicht getestet, aber vielleicht hilft es Dir (und ist eine Alternative zu Luckies Methode).
Angehängte Dateien
Dateityp: zip gpsyshook_109.zip (33,0 KB, 40x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

Re: Mausrad abfangen - drehung außerhalb der anwendung erken

  Alt 20. Dez 2006, 12:03
Zitat von alzaimar:
Mir ist nicht bekannt, das die DLL in jeden Prozess injiziert werden muss. Es ist aber so, das (nach meinem Halbwissen) Windows es nicht zulässt, das eine EXE einen globalen Hook einrichtet, denn wenn die EXE wegballert, ohne den Hook wegzunehmen, schießt sich dadurch Windows ab.
Die Injektion nimmt Windows vor. Das hat also schon seine Richtigkeit und ist auch was Luckie meint. Was er allerdings übersehen hat, ware die Tatsache, daß die Journal-Hooks auch aus einer EXE heraus global operieren können. Und der Begriff Hardware-Hook war ohnehin für die Katz.

Das mit dem Abschiessen des Systems war bis Windows ME ein Problem. Heute nicht mehr

Zitat von alzaimar:
Also hat MS sich gedacht: Globale Hooks nur in DLL. Du schreibst also eine kleine Hook-DLL, lädst die permanent und initialisierst aus dem DLL-Code heraus den Hook. Nun sieht Windows, das der Hook aus eine DLL zeigt und die Welt ist in Ordnung, denn Windows kontrolliert, wann die DLL wieder aus dem Speicher verschwindet. Über ein Callback realisierst Du die Benachrichtigung, das etwas passiert ist.
Nein, der simple Grund ist, daß nur eine DLL in mehreren Prozessen gleichzeitig existieren kann. Wenn du das überprüfen möchtest, kannst du gern mal in deiner Hookfunktion den Rückgabewert von GetCurrentProcessId() ausgeben lassen

Zitat von alzaimar:
Ich denke mal, das meint Luckie et al. mit 'injizieren', oder? Leider finde ich meine DLL nicht mehr, die das so gemacht hat. Ich weiss nur noch, das man den DLL-Initialisierungscode (DllMain) selbst schreiben muss, damit das klappt.
SetWindowsHookEx erledigt das für dich. Fensterhooks (worüber wir hier reden) haben nichts, aber auch garnichts mit API-Hooks zu tun!
  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 22: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