Capture keyboard input naar specifiek programma

Pagina: 1
Acties:

  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Ik probeer de muis en keyboard input naar een bepaald programma te capturen.
Dit is voor intern gebruik. De bedoeling is om alle input naar een programma te capturen en later weer te kunnen afspelen voor testprocedures.

Ik gebruik hiervoor journalrechook. Als ik dit test in een applicatie, krijg ik bij muisclicks, de handle naar het window terus en kan hiermee bepalen welk window het was en dus filteren op een bepaald programma.

Echter als ik keyboard input ontvang, geeft hij als Windoname altij DiemWin als windownaam.

Een search in google levert maar een paar hits op, waar ik niks mee kan.

Weet iemand wat DiemWin is en waarom ik deze krijg als windowname?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Wat geinig, ik ben met ongeveer net zo'n project bezig. Zie ook mijn topics [rml][ C#/Win32] Local Hook[/rml], [rml][ Win32] User32: functies voor objectherkenning[/rml], [rml][ C++/Win32] Opvragen van object-name uit ander proces[/rml] en [rml][ C#/.NET] pointer/interface/struct[/rml].

Maar ik dacht dat met de journalrechook niet mogelijk was te filteren. Ook maar gauw even uitzoeken dus :)

[ Voor 11% gewijzigd door riezebosch op 17-11-2004 11:29 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Mijn programma werkt nu als volgt:

Ik heb een global hook dll gemaakt.
Vanuit het programma wordt deze opgestart. Voordat hij opgestart wordt, zet ik in
shared memory de handle naar mijn programma.

Als de hook dll nu een keyboard of muis input ontvangt, wordt de MSGEVENT (in LParam) in het shared memory gezet en vervolgens wordt er een message naar het initiele programma gestuurd.

Hierin bepaal ik aan de hand van de MSGEVENT in de shared memory, wat voor input het is (muis of keyboard). Het MSGEVENT bevat ook de handle naar het object, voor wie de message bedoelt was.

Dit werkt goed voor Muisclicks (up or down)
Maar voor KEYDOWN of UP, krijg ik altijd de handle naar DiemWin.

Ik kan nu dus niet bepalen of de keyboard input voor applicatie X bedoelt is of voor een ander programma.

Het proberen te identificeren welk veld in app X gebruikt werd, is bijna onmogelijk.
Dit werkt alleen goed met de coordinaten. Maar omdat de te testen applicaties van ons, volledig met het keybaord kunnen worden aangestuurd, ben ik alleen geinteresseerd in de keyboard input.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Ik meende ergens gelezen te hebben, maar kan het niet terugvinden, dat het niet verstandig is vanuit de Callback een SendMessage te doen, aangezien de afhandeling daarvan te lang kan duren om de Callback goed af te handelen...

Maar ook voor de WH_JOURNALRECORD heb je dus een DLL en Shared Memory nodig? Kan ik dan ook vanuit de Callback een SendMessage (ervan uitgaande dat dit wél de manier is) naar een .NET applicatie doen en van daaruit het Shared Memory uit te lezen? Als dat niet kan zijn global hooks dus echt onmogelijk in .NET?

[antwoord]
Je kan natuurlijk wel vanuit je eigen applicatie het threadId van de huidige applicatie eruit filteren en dat controleren met die van de applicatie die je wilt hooken. Misschien kan je dit ook zelfs in je callback doen, zodat je alleen een SendMessage doet als het de juiste is.

Maar wat is dan nog het voordeel van een Journal Hook? Je kan dan toch bijna net zo goed een Mouse- en een Keyboard Hook zetten?

[ Voor 30% gewijzigd door riezebosch op 17-11-2004 12:59 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
Misschien nuttig: link. Hier staat dat WH_JOURNALRECORD en WH_JOURNALPLAYBACK niet in een DLL hoeven en ook niet in de remote-thread geïnjecteerd moeten worden.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack