MessageCodes umwandeln
-
Ich würde sagen, du machst das selber, da es meines Wissen keine eigene Funktion dafür gibt..
Also einfach beim bekommen der MessageCodes zB in einem Array nachschauen welche Message diesem Code gehört, dann einfach ersetzen...
Sollte denke ich mal nicht allzu schwer sein, als nur Tipparbeit
-
das wird dann aber eine ziemlich große map bzw ein großes array wenn ich mir mal anschaue wie viele messages in der winuser.h definiert sind!
Winuser.h hat ja nur schlappe 13.000 Zeilen
(selbst wenn das nicht alles messages sind sind das doch seehr viele)weiß eigentlich jemand was 0x0132 heißt? ich finde das nirgends in WinUser.h (WM_CTLCOLORMSGBOX ist es leider nicht)

lg,
andi01.
-
In spyxx.exe muss ja so eine Map drin sein... aber an die wirst Du vermutlich nicht so einfach rankommen... muss doch mal IDA Pro anschmeissen...
-
Aber gibt es nicht nur etwa 200 Nachrichten ??
Stand glaub ich im Petzold.
Also nur die WM_xxx Nachrichten...
-
kann sein, aber es kommen ja noch weitere dazu... zumbeispiel die wichtigsten Messages um Childwindows zu steuern (zB BM_... , BN_... für buttons), da die meisten Fenster ja auch einige childs haben wie Buttons, Checkboxen, Radiobuttons, Textboxen,... da kommen auch noch mal viele dazu^^
denn diese nachrichten werden ja auch (zumindest teilweise) an das parent geschickt.
zusammen sind das dann so viele, dass ich sie in realistischem Zeitaufwand unmöglich alle abtippen kann

(aber auch eine Liste für alle WM... wäre schonmal hilfreich)
lg,
andi01.
-
andi01 schrieb:
zusammen sind das dann so viele, dass ich sie in realistischem Zeitaufwand unmöglich alle abtippen kann

Was aber nichts an der Tatsache ändert, dass Windows dafür keine Funktion bereitstellt und du höchstens bei Google weiterkommst.

-
abtippen? nimm doch grep oder so
-
so, ich habe immerhin schonmal eine (hoffentlich wenigstens komplette) Liste aller existierenden Messages gefunden:
http://wiki.winehq.org/List_Of_Windows_Messagesjetzt muss ich die nur noch so weit kriegen, dass ich gezielt nach Werten darin suchen kann. Ich werde mir morgen mal in Ruhe einen Weg überlegen wie ich das am besten anstelle weil die liste für arrays etc. vermutlich zu lang ist...
ist sie denn wenigstens vollständig oder fehlern messages?
lg,
andi01.
-
lade sie in einen speicher und durchsuch sie, bau die datei einfach zb wie folgt auf:
das DateiFormat, vorschlag:
Byte:
FF FF = Word 0xFFFF als trennzeichen
xx xx = Word Als länge der Char, bzw länge der MessageCodes Beschreibung
xx xx = Message Codes als HEX
xx xx xx ... = Bezeichnung der MessageCodes in ASCII;dann lädst du die gesammte datei in den speicher und dursuchst den buffer!!
-
Warum so kompliziert? Man kann doch auch einfach ein Array benutzen. Der Lookup ist deutlich einfacher.
-
nimm ein switch/case!
-
buntehaare schrieb:
lade sie in einen speicher und durchsuch sie
das geht wegen der performance nicht, denn wenn man zB das Fenster so an den Bildschirmrand schiebt, dass es nur noch teilweise sichtbar ist und wieder richtung mitte zieht kommen schon mal 50 WM_PAINTs und andere nachrichten pro sekunde.
es sollte ziemlich unmöglich sein, eine Liste mit mehreren tausend einträgen 50 mal pro sekunde durchzugehen und die codes dabei umzurechnen(da dürfte einmal komplette durchsuchen und umrechnen max. 5-10ms dauern!) [jenachdem wieviele einträge es genau sind, die sprünge machen es ziemlich schlecht zählbar^^].bitsch schrieb:
nimm ein switch/case!
das wäre mit der Performance zwar nahezu perfekt aber ich kann unmöglich alles abtippen

O.o schrieb:
Warum so kompliziert? Man kann doch auch einfach ein Array benutzen. Der Lookup ist deutlich einfacher
Das Problem eines Arrays ist, dass die werte durchgehend besetzt sein müssen:
z.B. machen die nachrichtencodes in den dezimalwerten sprünge:
Liste schrieb:
84=WM_USERCHANGED
85=WM_NOTIFYFORMAT
123=WM_CONTEXTMENUund das geht öfter so... in einem standard-array kann ich aber nicht einfach lücken lassen

ich denke es wäre am einfachsten eine std::map zu verwenden, oder gibt es bessere Alternativen?
lg,
andi01.
-
Hier ein Beispiel wie man es einfach machen kann ohne das man den Wert der Nachricht im Code als Zahl schreiben muss.
#define WORDCASE(w) case w: return _T(#w)
static const TCHAR *printable_servicecontrol(DWORD dwControl) { switch (dwControl) { WORDCASE(SERVICE_CONTROL_STOP); WORDCASE(SERVICE_CONTROL_PAUSE); WORDCASE(SERVICE_CONTROL_CONTINUE); WORDCASE(SERVICE_CONTROL_INTERROGATE); WORDCASE(SERVICE_CONTROL_SHUTDOWN); WORDCASE(SERVICE_CONTROL_PARAMCHANGE); WORDCASE(SERVICE_CONTROL_NETBINDADD); WORDCASE(SERVICE_CONTROL_NETBINDREMOVE); WORDCASE(SERVICE_CONTROL_NETBINDENABLE); WORDCASE(SERVICE_CONTROL_NETBINDDISABLE); default: return _T("SERVICE_CONTROL_???"); } }
-
hm also zB 0x0007 ist nach meiner liste als WM_SETFOCUS definiert, deine Funktion sagt aber SERVICE_CONTROL_NETBINDADD

also es sollen eigentlich die codes für die Windows-Nachrichten in Text "umgewandelt" werden.
zb. 0x0007->WM_SETFOCUS
0x0008->WM_KILLFOCUS
...aber gibt es da auch so eine Funktion? das würde mir nämlich sehr viel Arbeit ersparen

ganau sowas bräuchte ich für diese codes, das wäre perfekt
edit: link zu Liste: http://wiki.winehq.org/List_Of_Windows_Messages
also mein aktueller Ansatz ist die Liste in eine txt-datei zu kopieren (das geht ja schnell), zu beginn des Programms einmalig in eine globale map einzulesen (bei der der dezimalwert der key-wert ist) und zur laufzeit unter den dezimalwerten mit fast perfekter performance die Nachrichten umzuwandeln...
oder kann man das noch geschickter oder besser lösen?
lg,
andi01.
-
oh mann das war ein BEISPIEL wie du es machen könntest für deine Nachrichten
-
Du kannst die HTML-Seite vom Wine-Wiki in OpenOffice Writer einladen und die Spalte kopieren dann hast du schonmal alle Nachrichten extrahiert. Dann musst du nur noch ein kleines Programm schreiben jeden String in dieses WORDCASE-Makro kapselt und du bist fast fertig.
-
also ich hätte es jetzt spontan mit einer map gelöst (nachdem ich die nachrichten extrahiert hatte) (siehe edit letzter post).
am wichtigsten ist eigentlich die performance weil sehr schnell sehr viele nachrichten ankommen^^
lg,
andi01.
-
Das ist kein Problem!
-
naja ich mache mich mal dran die nachrichten mit den codes in eine textdatei zu extrahieren.
bg,
andi01.
-
so ich habe jetzt die Datei soweit, dass vorne der dezimalwert steht, dann kommt ein tabspace und dann die Nachricht mit einer Zeile pro Nachricht.
meine datei sieht momentan so aus (upload) : http://www.dateiupload.com/files/Ql96mjhwqH.txt
auch die einlesemethode habe ich schon fertig.
auch die performance ist sehr gut (unter 1s!).
ich werde sie später mal in meine dll reinprogrammieren und schaun ob alles funktioniert.
übrigens so sieht die (vorläufige) methode zum einlesen aus:
#include<map> map<UINT, string> Nachrichten;//globale map bool ist_zahl(char zeichen)//nur ziffern { int i=static_cast<int>(zeichen); if(i>47&&i<58)//zwischen 0 und 9 { return true; } else { return false; } } void nachrichten_einlesen() { MessageBox(0, TEXT("beginne einlesen der Nachrichtenliste..."), TEXT("INFO:"), MB_OK); ifstream is("nachrichten.txt"); //einlesenund direkt verarbeiten: is.seekg(0L, ios::beg); char zeile[1024]; UINT code; string nachricht; string code_alt; if(is.is_open()) { while(!is.eof()) { is.getline(zeile, 1024);//zeile einlesen; //zeile filtern: //UINT-Wert filtern: //zeilenformat: 7=WM_SETFOCUS int a; for(a=0;ist_zahl(zeile[a])==true&&a<strlen(zeile);a++) { code_alt+=zeile[a]; } a++;//tabspace überspringen //Nachricht filtern: for(int b=a;b<strlen(zeile);b++) { nachricht+=zeile[b]; } //nachrichten konvertieren: code=atoi(code_alt.c_str()); //nachrichten hinzufügen: Nachrichten[code]=nachricht; //aufräumen: nachricht.clear(); code_alt.clear(); } } is.close(); MessageBox(0, TEXT("Einlesen beendet."), TEXT("INFO:"), MB_OK); }lg,
andi01.