MessageCodes umwandeln



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



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



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



  • @ bunthehaare:
    ich durchsuche ja praktisch den ram danach, sie stehen ja in einer std::map im Speicher. (nachdem ich sie aus der textdatei eingelesen habe). und die performance macht überhaupt keine Probleme! 🙂

    @Martin Richter:
    was die beiden fehlenden Nachrichten betrifft:
    dec:147 hex:0x0093 Nachricht: ?
    dec:146 hex:0x0092 Nachricht: ?

    ja, ich bin mir sicher! sie stehen gleich mehrmals in meinem log, und da stehen nunmal nur nachrichten die auch in der WndProc ankamen weil sie doch innerhalb der neuen WndProc geloggt werden!

    In meinem log stehen sie unter dem dezimalwert 147 bzw. 146 da.

    Auch wenn das log doch sehr groß wurde bis die zielnachrichten endlich vorkamen, habe ich es hier mal geuploadet, für den Fall dass sich jemand eine 2.5MB textdatei als lektüre antun will^^

    link: http://www.dateiupload.com/files/GC42qXp363.log

    die Messages wurden definitiv geloggt 😕
    und zwar (wie alle geloggten messages) mit allen zu diesem Zeitpunkt verfügbaren daten:

    also: Uhrzeit (sogar ms), Datum, WPARAM, LPARAM, WPARAM HIWORD, WPARAM LOWORD, LPARAM HIWORD, LPARAM LOWORD, HWND des Zielfensters, ob sie ans child oder parent gingen, natürlich code der message, cursorposition zur zeit als die message empfagen wurde usw 😃

    ach ja, die log entstand aus notepad, ich habe eine dll injected und alle fenster incl. childs gesubclasst.

    im log steht übrigens auch alles über prants und childs, hwnds, anzahl,...

    edit: die Nachrichten stehen sogar gleich am anfang des logs!

    Martin Richter schrieb:

    SPI_SETDOCKMOVING ist keine Nachricht!

    das dachte ich eigentlich auch 😕 aber der code 145(dec) kommt eindeutig in der log als nachricht an und (nach hex konvertiert) ist dieser Code in WinUser.h nur als SPI_SETDOCKMOVING definiert un in allen anderen Listen gar nicht, das ist etwas verwirrend...

    lg,
    andi01.



  • Aber nur weil in winuser.h steht, dass SPI_SETDOCKMOVING 0x0091 ist heißt das noch lange nicht, dass es sich dabei um eine Nachricht handelt, die an ein Fenster geschickt wird. Bei SPI_SETDOCKMOVING handelt es sich um ein Flag. Es kann durchaus Überschneidungen zwischen irgendwelchen Flags und tatsächlichen Nachrichten geben, das heißt aber nicht, dass die in irgendeiner Weise etwas miteinander zu tun haben müssen.
    Ich würde behaupten bei den Nachrichten handelt es sich um windowsinternen Nachrichten, die nirgends dokumentiert sind.



  • gut, ich habe jetzt die nachrichten eingetragen und alles funktioniert soweit, danke an alle 🙂

    dann kann ich ja jetzt anfangen mir die abfolgen der messages anzuschauen (zB bei buttonklicks).

    weiß jemand auf welche messages ich bei einem buttonklick achten muss? (da kommen so viele an 😃 )

    also ich habe schon rausgefunden, dass dem entscheidenden WM_COMMAND eigentlich immer ein WM_NCHITTEST mit den absoluten mauskoordinaten im LPARAM HIWORD(y) und LOWORD(x) vorausgeht.

    allerdings steht im WM_COMMAND LPARAM LOWORD immer eine Zahl, ist das die id des buttons oder controls das angeklickt wurde?

    oft kommen vorher auch WM_MOUSEMOVE und WM_SETCURSOR, werden die auch beim klicken gesendet oder wenn man die maus auf den button stellt?

    und wenn ich jetzt einen buttonklick simulieren will, reichen dann WM_NCHITTEST und WM_COMMAND oder muss ich auch WM_SETCURSOR und WM_MOUSEMOVE schicken?

    lg,
    andi01.


  • Mod

    Was willst Du eigentlich machen?
    Was interessiert Dich was für Nachrichten bei einem Buttonb-Click ausgelöst werden.

    Viele Nachrichten werden doch nur in Folge von vorher empfangenen Nacrichten ausgelöst.
    Auf ein WM_NCMOUSE... Nachricht müssen WM_NCHITTEST folgen, daraus entsteht dann erst eine WM_MOUSE... Nachricht, was wiederum evtl. WM_SETCURSOR auslöst etc.

    Alles ist in der MSDN dokumentiert...

    Nochmal: Was willst Du eigentlich damit?

    BTW: Spy++ zeigt Dir das alles perfekt an. Baust Du Spy+ nach oder was?



  • Martin Richter schrieb:

    Was willst Du eigentlich machen?

    ich will herausfinden welche messages ich in welcher reihenfolge und an welche fenster senden muss wenn ich zB einen fremden Button anklicken will.

    Martin Richter schrieb:

    Was interessiert Dich was für Nachrichten bei einem Buttonb-Click ausgelöst werden.

    ganz einfach: wenn ich selber so einen Klick simulieren will muss ich wissen welche messages ich wohin senden muss.

    zum thema button anklicken habe ich natürlich auch schon gegoogelt, allerdings waren die meisten Beispiele nur für eigene Buttons oder mit mouse_event().
    Ich habe noch nirgends ein Beispiel gefunden wo steht welche Messages ich in welcher reihenfolge senden muss, wenn ich einen button anklicken will.

    deshalb wollte ich mir mit diesem projekt einfach mal anschaun welche messages gesendet werden wenn ich einen button klicke. Aber das ist wohl doch komplizierter als ich dachte...

    wenn spy++ das alles anzeigt würde das auch reichen... aber wo bekomme ich das her? ich habe schonmal bei visual studio 2010 im ordner gesucht aber keine spyxx.exe oder spy++.exe gefunden und ich finde sie auch nirgends zum download 😞

    lg,
    andi01.



  • Man sollte keine Nachrichten, die normalerweise nur von Windows verschickt werden, selbst verschicken, da das zu undefiniertem Verhalten führen kann.

    Zu den Themen Maus- und Tastatureingaben simulieren solltest du hier im Forum eigentlich genug finden, benutze einfach mal die Suche.



  • ja, ich habe auch Beispiele gefunden.

    das Problem dabei ist, dass man das Fenster in dem der anzuklickende Button ist nicht minimiert lassen kann sondern kurz einblenden muss, um dann den Mausklick auszuführen (mouse_event, SendInput(), etc. ).

    Ich bin auf der Suche nach einem Weg wie man einen Button klickt ohne den User dabei "zu stören", also dass alle fenster so bleiben wie sie sind und ich keine maximieren muss...

    alle gefundenen Beispiele waren zu mouse_event() oder SendInput().

    deshalb versuch(t)e ich an den jeweiligen Button einfach die entsprechenden Messages zu senden.

    mir wäre eine Alternative zum senden der Messages auch lieber, aber ich habe noch nirgends eine gefunden 😞

    BTW: wo bekomme ich die spyxx.exe jetzt eigentlich her?

    lg,
    andi01.


Anmelden zum Antworten