SendMessage funktioniert nicht



  • Hi,

    hab ein sehr merkwürdiges Problem. Ich hab ne eigene Message definiert und will die an einer bestimmten Stelle absenden. Problem is wenn ich es mit SendMessage mache funktioniert es irgendwie nicht. Die Funktion gibt auch 0 zurück. Wenn ich es aber mit PostMessage mache klappt es (1 wird zurück gegeben). Woran kann das liegen? Ich benutze kein Multithreading und GetLastError() gibt auch 0 zurück...

    MFG


  • Mod

    Ist die Frage ein Witz?

    PostMessage stellt die Nachricht in die MessageQueue! Und du bekommst das Ergebnis, ob das geklappt hat. D.h. auf die Antwort wird nicht gewartet.

    SendMessage sendet die Nachricht an das Fenster und gibt das zurück was das Fenster antwortet. Wen also das Fenster mit 0 antwortet, dann bekommst Du 0!

    Wie wäre es mit etwas Studium der Doku bzgl. der Rückgabewerte?
    Diese Frage hättest Du Dir selbst beantworten können.

    SendMessage
    http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx

    The return value specifies the result of the message processing; it depends on the message sent.

    PostMessage
    http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

    If the function succeeds, the return value is nonzero.

    If the function fails, the return value is zero. To get extended error information, call GetLastError



  • ja schön dass das alles so is. Fakt ist aber dass es mit sendmessage nicht funktioniert und mit postmessage schon. Und dass ich jetzt weiß wofür die rückgabewerte stehen löst immernoch nicht mein problem


  • Mod

    Was funktioniert nicht?
    Kommt die Nachricht nicht an?
    Oder macht sie nicht was Du willst?

    Leider sagst Du nicht ob das Fenster in Deinem eigenen Prozess liegt oder wo anders, etc. pp. ...
    Ansonsten wäre ein Stück Code evtl. angebracht.

    In Deinem Posting schilderst Du wie Du Rückgabewerte interpretierst und Deine Interpretation war eben falsch.



  • Martin Richter hat das wesentliche zu SendMessage und PostMessage bereits gesagt. Vielleicht ist das etwas kurz und abstrakt?
    Du hast in beiden Fällen eine simple C-Funktion mit Parametern und Rückgabewert. Es wird von irgendwoher nach irgendwohin etwas über die Parameter gesendet. Der Rückgabewert teilt mit, ob die Sendung erfolgreich war oder nicht.
    Konzentriere dich im ersten Schritt auf die Parameter HWND, MSG, WPARAM, LPARAM auf der sendenden Seite. Ist da irgendein Fehler, läuft die Sache ins Leere. Danach siehst du dir die empfangende Seite an, ob das so ankommt, wie du dir das vorgestellt hast.
    Eine eigene Protokolldatei auf der sendenden und der empfangenden Seite erscheint mir hier ratsam. Näheres hierzu findest du auf meiner Homepage berniebutt://npage.de unter Programmierung->Protokolldatei.
    Oder teile einfach mehr Code mit. Den Fehler können wir nicht erraten! :p



  • @Martin Richter
    ja das Fenster ist im eigenen Prozess
    @berniebutt
    Ne dann müssten die Parameter ja auch bei Postmessage falsch sein.

    Ich poste mal den source

    #define WM_MYMSG 0x3E8
    
    long CALLBACK WndProc(HWND hwnd, unsigned int msg, WPARAM wParam, LPARAM lParam)
    {
       switch(msg)
       {
       //...
         case WM_COMMAND:
           switch(LOWORD(wParam))
           {
             case ID_SEARCH:
               SendMessage(hwnd, WM_MYMSG, 0, 0); //klappt nicht
               PostMessage(hwnd, WM_MYMSG, 0, 0); //klappt
             break;
           }
         break;
         case WM_MYMSG:
           //...
         break;
      }
      return 0;
    }
    

    Das ID_SEARCH kommt vom Menu. Dahin kommt er auch immer. Natürlich probiere ich immer nur eins von beiden (PostMessage oder SendMessage) zu benutzen um bei case WM_MYMSG: dann zu gucken ob es geklappt hat. Ich brauche aber auf jeden fall SendMessage


  • Mod

    1700 schrieb:

    #define WM_MYMSG 0x3E8
    

    Schöner Unfug:

    /*
     * NOTE: All Message Numbers below 0x0400 are RESERVED.
     *
     * Private Window Messages Start Here:
     */
    #define WM_USER                         0x0400
    

    Das ein falsches Verhalten ein undefiniertes Verhalten auslösen kann ist Dir bewusst? 😃



  • WM_USER Notification
    The following are the ranges of message numbers

    Range            Meaning 
    0 - WM_USER–1    Messages reserved for use by the system. 
    WM_USER - 0x7FFF Integer messages for use by private window classes. 
    WM_APP - 0xBFFF  Messages available for use by applications. 
    0xC000 - 0xFFFF  String messages for use by applications. // RegisterWindowMessage
    Greater than 0xFFFF Reserved by the system
    

    0x3E8 (0 - WM_USER-1) ist nich definiert, so die kann anuliert werden.



  • ok danke jetzt gehts


Anmelden zum Antworten