MessageCodes umwandeln
-
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.
-
so ich habe jetzt alles implementiert und es funktioniert perfekt

auch die Performance ist gar kein Problem.aber es tauchen immer wieder 3 codes in meinem log auf die offenbar in der liste fehlen:
176
201
187weiß jemand für welche Messages die stehen?
lg,
andi01.
-
Was wird den geloggt?
LRESULT CALLBACK neueWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)Nur der Teil "message" oder gehst du ins Detail und untersuchst auch "lParam" bei WM_NOTIFY und "wParam" bei WM_COMMAND?
-
natürlich gehe ich ins detail, die funktion ist in meinem code um einiges komplizierter als ich sie hier gepostet habe.
ich habe den Code nur auf das Wesentliche reduziert um keine 100 Zeilen für etwas posten zu müssen was ich auch in 5 erklären kann
. (nämlich die tastsache, dass für die Messages zu diesem zeitpunkt nur die codes wie 0x0007 ankamen, ziel des codeschnippsels war es den grund dafür anschaulich zu machen^^)natürlich logge ich auch wparam, lparam, die jeweiligen HIWORDs und LOWORDs, ob die message ans child oder parent ging, uhrzeit, datum,die aktuelle cursorposition als die nachricht reinkam,...
ich versuche nämlich gerade bestimmte message-abfolgen zu loggen, zB was passiert wenn man einen button klickt oder eine checkbox "checkt", welche messages werden gesandt mit welchen parametern usw.
dabei fehlern mir nur noch obige 3 codes dann habe ich das schonmal komplett, dann muss ich mich nur noch drum kümmern welche messages im zusammenhang mit einem bestimmten ereignis (zB button anklicken) stehen (zB anhand der exakten zeit).
lg,
andi01.
-
ich glaube du gehst ein bisschen zu tief ins detail das hört sich ja schon fast kriminell an.

-
die logs sind auch kriminell groß... viel zu groß, nach 1 minute loggen braucht editor schon 10 sec zum öffnen der datei

ich glaube ich werde mich mal auf die wesentlichen messaged beschränken und zB so sachen wie WM_PAINT oder so rausstreichen weil die mich bei Buttonklicks eher nicht interessieren.
Welche sind denn zB wichtig wenn ich einen Button drücke? auf jedenfall schonmal WM_NCHITTEST und WM_COMMAND, muss ich auf andere auch noch achten?
ich stehe noch ziemlich am Anfang mit meinen Kenntnissen bei welchen ereignissen welche messages geschickt werden und will mir das ganze über das log mal genauer anschaun^^edit: und ganz wichtig, auf welche parameter muss ich genau achten? zB wparam HIWORD oder Lparam LOWORD? ich logge nämlich erstmal alles und das wird sehr schnell sehr viel...
lg,
andi01.
-
andi01 schrieb:
edit: und ganz wichtig, auf welche parameter muss ich genau achten? zB wparam HIWORD oder Lparam LOWORD? ich logge nämlich erstmal alles und das wird sehr schnell sehr viel...
Ich hab mich zwar schon länger mit der WinApi direkt beschäftigt, aber wenn mich nicht alles täuscht, hängt das immer von der jeweiligen Nachricht ab. Was das dann im einzelnen bedeutet ist alles fein säuberlich im MSDN dokumentiert

-
andi01 schrieb:
natürlich gehe ich ins detail, die funktion ist in meinem code um einiges komplizierter als ich sie hier gepostet habe.
ich habe den Code nur auf das Wesentliche reduziert um keine 100 Zeilen für etwas posten zu müssen was ich auch in 5 erklären kann
. (nämlich die tastsache, dass für die Messages zu diesem zeitpunkt nur die codes wie 0x0007 ankamen, ziel des codeschnippsels war es den grund dafür anschaulich zu machen^^)Aha!?

"winuser.h" z.B. EM_GETSEL = 176
Guggst du weiter findest du alles.
-
oh mir fällt gerade noch ein anderes Problem meines Programmes auf...
Die Messages kommen ja als hex-werte rein, oder?
das problem ist nämlich, dass in meiner textdatei die dec-werte stehen^^kann ich im programm die im Parameter message (typ UINT) ankommenden hex-werte in meinem programm irgendwie so umrechnen, dass die Performance erhalten bleibt?
(denn der einzige Weg der mir auf die Schnelle einfällt wäre über stringstreams, aber die sind viel zu langsam
)gibt es eine Möglichkeit mit guter Performance?
denn ich kenne nur diesen langsamen Weg:
string hex_wert; string dec_wert; stringstream sstr; sstr<<hex_wert; sstr>>dec>>dec_wert;aber das ist zu langsam

lg,
andi01.
-
Die Messages kommen nicht "als Hex-Werte rein". Das ist wieder so eine Darstellungssache. Computer verstehen nur 0 und 1. Menschen können damit nicht viel anfangen, eher etwas mit dem Dezimal- oder Hexadezimalsystem. Alles was du also tun musst ist dafür sorgen, dass die Werte die du aus deiner Datei liest auch vom Typ
UINTsind.
-
also ich hatte die werte aus der datei ungefähr so eingelesen und "umgerechnet":
char zeile[1024]; ifstream is("C://test//test.txt"); while(!is.eof()) { is.getline(zeile, 1024); string eingelesen=zeile;//hierin befindet sich die eingelesene zahl aus der datei UITN wert; wert=atoi(eingelesen.c_str(); }stimmt das so?
lg,
andi01.
-
so, ich hab mich jetzt mal in das thema hexadezimalsystem in wikipedia eingelesen... im UINT-wert steht aber sowieso der dezimalwert

und in meiner log stehen auch die dezimalwerte, deswegen habe ich die dezimalwerte die dort ankommen (da sie in nachrichten.txt, der liste) fehlen ins hexadezimalsystem umgerechnet und in WinUser.h nachgeschaut.
und die meisten fehlenden Werte habe ich auch gefunden:
dec:147 hex:0x0093 Nachricht: ?
dec:145 hex:0x0091 Nachricht: SPI_SETDOCKMOVING
dec:146 hex:0x0092 Nachricht: ?
dec:176 hex:0x00B0 Nachricht: EM_GETSEL
dec:201 hex:0x00C9 Nachricht: EM_LINEFROMCHAR
dec:187 hex:0x00BB Nachricht: EM_LINEINDEXstimmen die wenigstens so damit ich sie ergänzen kann? wenn ja hab ichs endlich verstanden

aber was sind die Nachrichten wo ein ? steht? die konnte ich in WinUser.h nicht finden, trotzdem werden sie aber ziemlich oft geloggt und damit auch verschickt.
lg,
andi01.
-
andi01 schrieb:
so, ich hab mich jetzt mal in das thema hexadezimalsystem in wikipedia eingelesen... im UINT-wert steht aber sowieso der dezimalwert

Auch wenn ich damit etwas vom Thema abkomme hier ein kurzer Exkurs zu Stellenwertsystemen, weil ich finde als Programmierer sollte man das wissen, weil es Missverständnisse vermeiden hilft:
Es gibt prinzipiell unendlich viele Stellenwertsysteme, in Verbindung mit Computern werden in der Regel aber nur 3-4 verwendet, das sind das Dual-, das Oktal-, das Dezimal- und das Hexadezimalsystem. Alle Systeme haben ihre Daseinsberechtigung und sinnvolle Verwendung. Die einzelnen Systeme unterscheiden sich durch Ihre Basis. Beim Dualsystem ist das die Basis 2, Oktal 8, Dezimal 10 und Hexadezimal 16. Die Basis gibt an wieviele Zahlsymbole es in dem System gibt (Dual: 0, 1; Dezimal 0-9 usw.)
Das führt dazu, dass man ein und die selbe Zahl in vier verschiedenen Schreibweisen darstellen kann, nehmen wir als beispiel den dezimalen Wert 134, den kann man wie folgt darstellen:
Dual: 0b10000110
Oktal: 0o206
Dezimal: 134
Hexadezimal: 0x86Was ich damit sagen will, es ist völlig unerheblich WIE der Wert eines
UINT(oder eines jeden anderen Zahltypen) dargestellt wird. Es ist immer der gleiche Wert, nur eine andere Schreibweise.Zu den fehlenden Nachrichten kann ich dir leider nicht weiter helfen

-
erstmal thx für den Exkurs, ist wirklich wissenswert.
und was die beiden fehlenden Messages betrifft, ich habe alle listen die google gefunden hat durchsucht, nirgends tauchen die dec- oder hex-werte auf.
Es ist als würden sie gar nicht existieren... aber sie werden eindeutig versendet weil sie ja auch geloggt werden
(für den fall dass eine message in der Liste nicht gefunden wird loggt meine funktion nämlich den messagecode (also den im Paramater UINT message von der WndProc)).
aber obige Liste ist wenigstens korrekt, sodass ich die schonmal in meiner Nachrichtenliste ergänzen kann, oder?
lg,
andi01.
-
Alle Messages von 0x89 bis 0x8f sind nicht definierrt. SPI_SETDOCKMOVING ist keine Nachricht!
Bist Du sicher, dass diese Nachrichten wirklich existieren?
-
in einem meiner logs tauchten sie jedenfalls auf

ich werde morgen mal eine neue log erstellen und schaun ob sie wieder da sind

(dummerweise habe ich die alte mit diesem messages bereits gelöscht
)
lg,
andi01.
-
andi01 schrieb:
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^^].quatsch, zb 2GB, nach 4 bytes zu durchsuchen wenn sie im ram sind dauert keine 10 ms
cu, den speicher zu durchsuchen geht ras3end schnell mal überlegt wieviel daten in GB eine RAM pro sekunde verschieben kann?