MessageCodes umwandeln



  • 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.



  • 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
    187

    weiß 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 UINT sind.



  • 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_LINEINDEX

    stimmen 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: 0x86

    Was 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.


  • Mod

    Alle Messages von 0x89 bis 0x8f sind nicht definierrt. SPI_SETDOCKMOVING ist keine Nachricht!

    Bist Du sicher, dass diese Nachrichten wirklich existieren?


Anmelden zum Antworten