Entwickler-Ecke
Windows API - lesen aus einem "unbekannten" Fenster
energyx - Mo 21.02.05 13:54
Titel: lesen aus einem "unbekannten" Fenster
Hi!
Also, ich hab hab folgendes nettes Problem:
Ich arbeite an einem ASUS W1N Notebook. Bei diesem Notebook ist eine Fernbedienung mit dabei, die aber nur mit der dazugehörigen Softer ( die is für'n *popo*) funktioniert. Allerdings läuft nebenbei im Systemtray ein Programm namens: Remote Controler 2.1. von ITE Tech ( oder auch Remotecontrolservice genannt) ... Diese Programm reagiert auch auf die Fernbedienung und gibt einen Code auf dessen "Form" aus um welche Taste es sich handelt.
Nun zu meinem Problem: Ist es möglich diese Information aus dem Fremdprogramm abzufragen/tasten um mir darauss, einen eigenen universal Handler zu bauen, über den ich dann Tastendrücke emullieren kann, um damit dann windows mit der tastatur zu steuern? oder kann man evtl. den code ...öhm.. ;) ... das ich weiß wie der aufgebaut ist? ...is aber so wie ich die jung von asus kenn mit VS.Net geproggt...
Nunja, vielleicht hat ja wer eine idee =)
Karlson - Mo 21.02.05 14:57
Musst du mal schauen ob du an das Handle des Textes kommst. Müsste eigentlich ein Static sein.
FINDWINDOW um das Parentwindow zu suchen.
FINDWINDOWEX um das Static zu finden.
Lass mal
WINSPY schauen ob du überhaupt an das Handle kommst.
Wenn das Control nicht vom Typ TWinConrol ist kommst du nicht dran.
Dann haste noch die Möglichkeit, mit ner
PIPE direkt auszulesen was das Programm für Nachrichten bekommt. (Sehr schwer).
leichter dürfte es sein die Textinformationen in einer Array of Char direkt aus dem RAM auszulesen. Dafür musste aber die Adresse wissen und beten dass keine DMA verwendet wird. Schau dir dafür
READPROCESSMEMORY, ist im Grunde relativ einfach dann. Um die Adresse zu finden empfehle ich
TSEARCH.
Geschickter wäre es natürlich wenn du wüsstest welche Messages verschickt werden wenn eine Taste auf der Ferbedinung gedrückt wird. Wie du daran kommst habe ich keine Ahnung ;)
Ne dokumentierte DLL ist nicht zufällig dabei?
Eine Idee hätte ich noch: Bei der Fernbedinung meiner TV Karte ist das ziemlich geschickt gemacht. Wird z.B. Play gedrückt, drückt der Handler des Treibers virtuell die Taste 180.
Nimm dir mal den Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure Timer; var i : integer; begin timer1.interval := 1; for i := 1 to 200 do if boolean(GetAsyncKeyState(i)) then showmessage(inttostr(i)); end; |
Mit dem Code kann ich dann auch abfragen ob die Taste 180 gedrückt ist, und in meinem eigenem Programm dementsprechend handeln.
energyx - Mo 21.02.05 20:45
Okay, cool.... also an die Handles komm ich ran!
Ist eine Aboutbox und die Daten werden in eien TStatusbar geschrieben!!
Bekomm dann diese tolle Handle Nummer $000D03DE ... und über die kann ich nun versuchn die Daten auszulesen?!
Das guuuut =)
Muss ich mal schauen wie das funzt!
Danke für deine dicke Antwort! Sehr fein!!!
Karlson - Mo 21.02.05 23:47
Pass auf! $000D03DE kann doch niemals ein Handle sein! Wenn dann 852958. Ein Handle ist immer von Typ Cardinal (das ist eine abart des Integers). Dein $000D03DE ist ein Hexwert...wo hast du den denn her?
Ist im grunde egal, weil das so eh nicht funktioniert.
Handle ist kein fixer Wert. Es ist vielmehr irgendeine Zahl, die Windows jedem Fenster zuteilt, damit windows auch weiss wo es irgendwas hinschicken muss. Vergeben wird diese Zahl im grunde willkürlich, und zwar jedes mal aufs neue, wenn das Fenster gestartet wird.
Lade dir
WINSPY von TomS hier aus dem Forum herunter.
Suche das Handle der Statusbar.
Dann klickst du auf FindWindowCode generieren.
Den Code kannste übernehmen.
Der Wert des Handles hat dich garnicht zu intessieren, du musst nur wissen das er dann in der Variable hwnd gespeichert ist.
Auslesen kannste das dann mit
WM_GETTEXT
energyx - Di 22.02.05 00:39
richdiisch!! is der Hexwert, bekomm ich über X-Spy raus...und auch den Handle: von der Form : About, von der Komponente, wo dann die daten drinstehn is die TStatusbar! Haste wunderbar erkannt =)
Das WinSpy versuch ich mal noch.
Ein Problem hät ich noch:
In dem Andern Fenster, wo der Code in die Statusbar geschrieben wird, wird nur sehr kurz eingeblendet...also muss ich das programm also immer abtasten lassen....am besten mit nem timer mit niedriger Frequenz, oder?
thx, Kris
Karlson - Di 22.02.05 00:41
ist dir jetzt wenigstens klar das du mit dem hexwert von xspy nichts anfangen kannst?
zu dem anderem: Ja ist zwar hoffnungslos schlechter stil, aber wird mit der Lösung anders wohl nicht gehen.
schlumpf70 - Di 22.02.05 00:43
| energyx hat folgendes geschrieben: |
Ein Problem hät ich noch:
In dem Andern Fenster, wo der Code in die Statusbar geschrieben wird, wird nur sehr kurz eingeblendet...also muss ich das programm also immer abtasten lassen....am besten mit nem timer mit niedriger Frequenz, oder?
thx, Kris |
nein solange das fenster nicht zerstört wird ist der wert trotzdem noch da denke es wird nur unsichtbar
energyx - Di 22.02.05 01:33
hmmm...das will noch nicht so richtig....fehler bekomm ich ich keine, aber er ließt mir immer einen leerstring aus....muss ich irgendwas beachten wenn es sich um eine Statusbar handelt?!
Hab das Prinzip mit Handles usw. nun schon verstanden, konnte auch das notepad beispiel nachvollziehen....schon komisch das ganze....irgendwie ist da meine Delphi Hilfe auch wenig zu gebrauchen...wie kommt das denn zustande? Wo bekomm ich den da mehr infos in Form einer Hilfe ?!
Gothicware - Di 22.02.05 02:36
Mal ne Blöde Frage, ist das ne Funk, oder eine IR-Fernbedienung???
Infarot, läuft meist über ein Serial-Bus. Das heisst, Programm was auf die Serielle zugreift, beeenden, und eigenes dranhängen. Dann musst du nur noch die passende
Baud Geschwindigkeit rausfinden und dir einen Datensatz Tabelle zu Taste, und Übermittellter Code erstellen.
Ansonsten würde ich mal verschiedene
HOOKS ausprobieren, und sehen, wo ich was vom Programm abfangen kann. Dann brauche ich keinen Timer der meine System Leistung Missbraucht, da meine
HOOK Procedure nur dann aufgerufen wird,
wenn eine Nachricht vom Selben Typ, durch das System geschossen wird. :)
energyx - Di 22.02.05 13:43
aha...HOOKS also...muss ich mich da auch mal reinlesen... Hab davon ja Null Ahnung, durfte mich die ganze Zeit immer nur mit Grids, SQL und so'n Zeugs rumschlagen... (Praxissemester ;)
UNd ja das ne Infrarot Fernbedienung...läuft über CIR, oder wie das heißt, also nicht der "normalo" Infrarotport wo du dein Handy z.B. anbindest...und das läuft wohl über ein eigenes Interface...ich hab nu auch schonmal ne Mail an die entwickler von der anderen SOftware geschrieben, vielleicht rücken die ja ein bischen was raus... Die netten Asiaten *ggg*
Also, ich werd dann bei Gelegenheit mal weiter berichten, wie es denn so vorran geht!
Ach und noch eins: Das Programm über das ich da versuch zu gehen läuft eigentlich nur in der SystemTray...das sollte auch noch ein Problem darstellen oda? So wie ich das gelesen habe, ist das dann nimmer so "einfach" =)
Motzi - Di 22.02.05 15:42
@Karlson: wieso kann $000D03DE kein Handle sein? $000D03DE und 852958 sind genau dasselbe, nur dass die eine Zahl zur Basis 16 und die andere eben zu Basis 10 angeschrieben ist... und wenn du das Handle hardcodest (was zwar nicht sehr sinnvoll ist, aber egal), dann akzeptiert Delphi sowohl die hexadezimale als auch die dezimale Schreibweise, also sag mir nicht mehr eine Hex-Zahl kann kein Handle sein! ;)
@energyx: ich weiß nicht welche Version meines X-Spys du hast, aber seit dem 28.05.04 kann auch der X-Spy FindWindowCode automatisch erzeugen...
energyx - Di 22.02.05 20:37
hmmm...also irgendwie will das nicht so ganz...inder statusbar steht definitiv was drin (fernbedienungkaputtdrück) aber ich bekomm immer nur nen leerstring raus....
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var text:array[0..255] of char;
SendMessage(wnd2,WM_GETTEXT,100,Integer(@Text)); memo1.Lines.Add(String(Text)); |
so sollte das doch gehen...das Fenster is auch und die Handles die Delphi ermittelt stimmen auch mit dem, was Xspy raus gibt überein! ( und danke für den Tip, Xspy kann auch Code erstellen!;) )
aber kommt nix bei raus... is immer leer... mal weiter Tut's und MSDN lesen ;)
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
Motzi - Di 22.02.05 20:48
Stimmt denn der Text den X-Spy anzeigt mit dem überein, was in der Statusbar steht..?
toms - Di 22.02.05 21:08
hi,
Den Text der Statusbar kannst du so nur auslesen, wenn
es sich um den ersten Panel handelt.
Alle anderen Panels lassen sich mit WM_GETTEXT nicht auslesen,
resp. es muss zuerst Speicher reserviert werden.
energyx - Di 22.02.05 21:56
so, also: wenn ich z.B. Miranda mit WinSpy "begutachte" und mir da z.b. die Statusbar anschaue steht der inhalt der statusbar auch bei winspy unter Titel/Text....wenn ich das mit dem ollen Tool mache, das auf meine Fernbedienung reagiert betrachte steht da nix drinne.
im meinem Bsp. ists auch so das in dem RCTool Klasse TStatusBar bei Miranda ists diese msctls_statusbar32 Statusbar.
Das doch alles shice....
@toms: Hä?! *gg*
ich mach meine Statusbars nie in ein Panel XD
toms - Mi 23.02.05 15:22
Eine TStatusbar kann sehr wohl Panels enthalten.
energyx - Mi 23.02.05 15:30
ach sorum meinst du das :roll: dann hat ich da ein verständnisproblem.... ja und wie komm ich dann nu da dran :?:
energyx - Mi 23.02.05 16:05
merci.... "wer hats erfunden?" ... =)
Aber woher weiß ich denn in welchem anderen Panel das Statusbar stehen soll bzw, in welchem Panel der Statusbar der zu suchen Text steht?!
SB_GETTEXT <-> WM_GETTEXT ... :?: Sollt ich es vielleicht mal damit versuchen?!
-UPDATE-
SB_Gettext funzt nid...: [Error] asus_rc.pas(44): Undeclared identifier: 'SB_GETTEXT'
-DONE- SB_GETTEXT hat mir nur ne USES KLausel gefehlt... aber geht trotzdem nicht :cry:
energyx - Do 24.02.05 16:43
So...gibt News ;)
Hab mal ein bischen rumgesucht in meinem System und hab dann rasubekommen, das es im Grunde 2 DLL's sind über die die ganze Sache abläuft....und so wie es aussieht wurde das ganze in C oder C++ geproggt...zumindest sieht es schwer dannach aus.... Bin auch beim durchstöbern auf eine Textpassage gestoßen wo von "TITECIRService" die rede ist...denke mal wenn ich die irgendwo herbekommen sollte es nicht mehr all zu schwer sein oda?!
Des weiteren geht das ganze wohl über ne ACPI- Schnittstelle: ACPI\ITE8704\3 hab auch IRQ und Speicherraum dazu (s.h. Geräte Manager )
Dann noch ein bischen weiter rumgespielt und hab mal mit WinSight32 versucht mehr infos von meinem tollen Fensterchen herauszubekommen...ohne erfolg, der bekommt nichtmal die Handles raus...
schon schade...nochmal ITE Tech anmailen....vielleicht rücken die ja was raus...*grml*
F34r0fTh3D4rk - Do 24.02.05 17:08
wie holst du dir denn das handle liest du es mit einem externen programm aus und trägst es dann ein ?
mach das mit findwindowsEx, dann brauchst du nur den typen und fertig is.
(das E groß geschrieben um 2deutigkeiten zu verhindern :D)
energyx - Do 24.02.05 17:37
| F34r0fTh3D4rk hat folgendes geschrieben: |
wie holst du dir denn das handle liest du es mit einem externen programm aus und trägst es dann ein ?
|
jojo, ich hol das schon dynamisch raus! Nur keine Angst....aber und fertig ist's halt nicht...er macht keinen Fehler, aber ich bekomm die Daten nicht ausgelesen!! immer ein leerer String. *grml*
F34r0fTh3D4rk - Do 24.02.05 18:04
probier es erstmal bei einem anderen programm (vielleicht eines welches du selbst geschrieben hast)
wenns dort auch net funktioniert, liegst am code, dann lässt sich leicht helfen, aber sonst, müsste das handle falsch sein
energyx - Fr 25.02.05 15:33
Nope...hab mal schnell ein Programm geschrieben, das rein optisch mal dem, wo ich die Daten auslesen will entspricht....und tadaa...geht! Da sachen auslesen No Prob! Aber mit dem Fensterchen wo ich meine Daten herhaben will funzt es nicht :(
Ja aber wie kann denn das Handle falsch sein... mit XSpy lass ich mir den Code erstellen der mir das Handle sucht!
Jetzt einfach mal so, ists theoretisch überhaupt möglich, den Fensterinhalt von außen zu "schützen"?
Das doch doof :(
uall@ogc - Fr 25.02.05 15:39
man kann handles schützen aber wenn du nen handle bekommst dann isses nicht geschützt
energyx - Di 01.03.05 12:49
so, nachdem ich nun als vergeblich versucht habe über das Handle an die Infos zu kommen...es will mir einfach nicht gelingen.... würd ich gern mal dem Versuch mim Speicher auslesen versuchen!! Wie mach ich das denn am Besten?!
thx =)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!