Wie kann ich in meiner MFC App. selbst erzeugte Nachrichten abfangen ?



  • hallo,

    jetzt hab ich noch ne frage (nerv):

    Ich hab ne Delphi-App geschrieben die ne Message broadcastet, die mit WM_SHIBBY := RegisterWindowMessage('shibby') registriert wurde und auch auf den empfang einer solchen reagiert (messagebox). Das funzt.

    Und ich hab ne MFC-App die ne Message broadcastet, die mit WM_SHIBBY = RegisterWindowMessage("shibby") registriert wurde. Die Delphi-App empfängt die auch. Funzt soweit sehr gut.

    Nur wie kann ich nun in meiner MFC App. die selbst erzeugte Nachricht abfangen, die meine Delphi-App versendet ?

    Ich habs bereits mit folgendem versucht, funzt aber net:

    BOOL CNachrichtenApp::ProcessMessageFilter(int code, LPMSG lpMsg)
    {
    // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    MSG MyMsg = *lpMsg;
    if (MyMsg.message == WM_SHIBBY)
    {
    MessageBox(NULL, "Info", "Nachricht da", NULL);
    }
    return CWinApp::ProcessMessageFilter(code, lpMsg);
    }

    Vielleicht ein wenig Beispielcode oder so ?

    wäre nett.



  • ON_MESSAGE



  • ???

    Was tu ich damit ?



  • Na in die MessageMap einbinden wie ON_COMMAND und jede andere Message auch



  • sorry. ich bin noch neu in dem thema. über die mfc weiss ich so gut wie nix. und wenn ich den code in api schreib, gehört mir ja die message-loop selber und ich fangs dort ab. aber ich möchte das ja in meiner mfc-app machen, die mich von der message-loop abschirmt. könntest du vielleicht ein wenig beispielcode reinschreiben, wo ich was tun muss. ich check das noch nicht ganz.

    wäre echt nett.



  • BEGIN_MESSAGE_MAP(CDeineklasseDlg, CDialog)
        ON_MESSAGE(WM_SHIBBY, deinefunktion)
    END_MESSAGE_MAP()
    


  • hi,

    das kann aber noch net alles sein. da muss noch was fehlen. ich hab in der MSDN noch folgendes gefunden, dass ich als prototyp in der Headerdatei eingetragen habe:

    für ON_MESSAGE( <message>, <memberFxn> )
    afx_msg LRESULT memberFxn(WPARAM, LPARAM);

    für ON_REGISTERED_MESSAGE( <nMessageVariable>, <memberFxn> )
    afx_msg LRESULT memberFxn(WPARAM, LPARAM);

    trotzdem mault der compiler noch. hat den keiner das schon mal selbst gemacht ?



  • Klar haben mache das schon selbst gemacht.
    Was schreibt den dein compiler ?



  • // Headerdatei Nachricht.h

    UINT WM_SHIBBY;
    afx_msg LRESULT OnShibby(WPARAM, LPARAM);

    // Codedatei NachrichtDlg.h

    BEGIN_MESSAGE_MAP(CNachrichtenDlg, CDialog)
    //{{AFX_MSG_MAP(CNachrichtenDlg)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(ID_SEND, OnSend)
    ON_BN_CLICKED(ID_CLOSE, OnClose)
    ON_REGISTERED_MESSAGE(WM_SHIBBY, OnShibby)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    void OnShibby()
    {
    MessageBox(NULL, "JUHU !", "Info", NULL);
    }

    Compilerfehler:

    D:\Cache\Hooks\Nachrichten\NachrichtenDlg.cpp(42) : error C2440: 'type cast' : 'long (__cdecl )(unsigned int,long)' kann nicht in 'long (__thiscall CWnd::)(unsigned int,long)' konvertiert werden



  • Weiss nicht, dachte nicht, dass Copy&Paste so schwer sein könnte:

    // *.h
    class CWndNochwas
    {
      // ...
      afx_msg LRESULT DeineFkt( WPARAM, LPARAM);
      // ...
    };
    
    // *.cpp
    BEGIN_MESSAGE_MAP(...)
      ON_REGISTERED_MESSAGE( WM_SHIBBY, DeineFkt)
    END_MESSAGE_MAP()
    
    LRESULT CWndNochwas::DeineFkt( WPARAM, LPARAM)
    {
      return 0;
    }
    

    Nimmt der Compiler ohne Meckern!



  • hi,

    ok. jetzt eine dämliche frage (in der hoffnung keine dämliche antwort zu bekommen:

    wo hast du in deiner mfc-app irgendeine klasse stehen, die mit CWnd beginnt ?

    ich hab da nirgends eine solchige.



  • nochmals hi an alle,

    ich hab das ganze jetzt mal neu geschrieben und die 3 einträge gemacht

    afx_msg LRESULT MyFunc( WPARAM, LPARAM);
    ON_REGISTERED_MESSAGE( WM_SHIBBY, MyFunc)
    LRESULT CNachrichtenDlg::MyFunc( WPARAM, LPARAM); //incl. def. natürlich.

    und PENG ! geht das ganze. sieht wohl so aus, als wär ich einfach ein idiot. ich glaube, bis ich richtig programmieren kann, vergeht noch einige zeit. die obige frage bleibt allerdings offen. bei mir gibs da nie was mit CWnd. Aber das is ja auch wurscht.

    vielen dank für eure mühen. ihr habt mir sehr geholfen.

    mfg niwes



  • wo hast du in deiner mfc-app irgendeine klasse stehen, die mit CWnd beginnt ?

    Du willst Messages verarbeiten ? Direkte Messageverarbeitung kann nur in Fensterobjekten (HWND) erfolgen [MessageLoop: GetMessage( HWND, ...)]. Jede MFC-Klasse mit MessageMap ist also irgendwo von CWnd abgeleitet, auch, wenn es nicht unbedingt mit CWnd... beginnt ! Daher habe ich es so genannt!


Anmelden zum Antworten