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.

Suche in: Delphi-Forum, Delphi-Library FINDWINDOW um das Parentwindow zu suchen.
Suche in: Delphi-Forum, Delphi-Library FINDWINDOWEX um das Static zu finden.

Lass mal Suche in: Delphi-Forum, Delphi-Library 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 Suche in: Delphi-Forum, Delphi-Library 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 Suche in: Delphi-Forum, Delphi-Library READPROCESSMEMORY, ist im Grunde relativ einfach dann. Um die Adresse zu finden empfehle ich Suche bei Google 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 Suche in: Delphi-Forum, Delphi-Library 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 Suche in: Delphi-Forum, Delphi-Library 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 Suche in: Delphi-Library HOOKS ausprobieren, und sehen, wo ich was vom Programm abfangen kann. Dann brauche ich keinen Timer der meine System Leistung Missbraucht, da meine Suche in: Delphi-Library 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..255of 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 user profile iconraziel: 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 :?:


toms - Mi 23.02.05 15:39

energyx hat folgendes geschrieben:
ach sorum meinst du das :roll: dann hat ich da ein verständnisproblem.... ja und wie komm ich dann nu da dran :?:


So: http://www.swissdelphicenter.ch/de/showcode.php?id=935


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 =)