SendMessage ohne WndProc?



  • Hallo, ich hab hier ein kleines Problem.

    Also, ich habe 2 Plugins. Eins ist ein Winamp plugin. Selber geschrieben, also volle Kontrolle darauf. Das zweite ist ein Plugin für ein Spiel (Garrysmod).

    Ich möchte nun einige daten aus dem Winamp Plugin zu dem anderen Plugin schicken.
    Normalerweise nutze ich dafür SendMessages. Aber ein Fenster im Plugin zu erstellen ist mir einfach zu blöd.

    Winamp bietet (Wie auch immer) an, ohne WndProc an die Daten zu kommen:

    int c = SendMessage(hwnd, msg, prarma, param);

    Ich habe direct den Wert in der Variable. So möchte ich das auch gern machen.
    Ironischerweise ist das suchen in google mit "Sendmessage ohne WndProc" oder "Sendmessage without Wndproc" immer das gegenteil. Ne menge Tutorials wie man SendMessages und WndProc nutzt 😞

    Hat einer von euch eine Idee? Stichwörter würden mir helfen 🙂

    mfg



  • Du suchst wohl nach einer Funktion wie PostThreadMessage.
    http://msdn.microsoft.com/en-us/library/ms644946(v=VS.85).aspx

    Edit: Beachte allerdings auch die Hinweise zu dieser Funktion, sonst könnte es zu Fehlern kommen.



  • Alles klar, Danke für den Tipp 🙂
    Ich schau mir das morgen mal in ruhe an 😉

    Grüße



  • Aloha,
    Ich habs mir jetzt mal angeguckt und schon etwas experimentiert.

    Glücklicherweise kann ich WndProc in dem Winamp Plugin Überschreiben.

    Also.

    Meine GarrysmodDll Also das Plugin das Daten empfangen möchte, sieht derweilen so aus:

    cout << atoi(argv[1]);
    		DWORD idThread = GetCurrentThreadId();//atoi(argv[1]);
    		MSG Msg;
    
    		int t = SendMessage(FindWindow(L"PostMsgTest",NULL), idThread, 15888 , 15888);
    		cout << t << "/n";
    
    		while (GetMessage(&Msg, NULL, 15888, 15888)) {
    			cout << "Message: " << Msg.lParam << endl;
    		}
    

    Die Nachricht wird gesendet, Empfangen und ich bekomm sogar eine Nachricht zurück. Aber genau das stinkt mir. Ich muss weiterhin GetMessage nutzen. Eigentlich wollte ich, dass ich direkt in der variable "t" die Nachricht hab.

    Das WndProc in der Winamp Dll hab ich normal überschrieben, hab also 4 Parameter.
    Darin frage ich ab welche Message kommt (15888) Dann sende ich einfach:
    PostThreadMessage(message, 15888, 5, 5);

    Bessere lösung ist mir nicht eingefallen.

    Ich hoffe auf Hilfe : /

    Grüße


  • Mod

    Und warum verwendest Du nicht einfachere Techniken wie
    - shared memory
    - named Pipes
    - Memory Mapped File



  • Solange es nur um einen einfachen Zahlenwert geht, könntest du auch so etwas benutzen:

    #define WM_USER_FOO (WM_USER + 4)
    // ...
    
    int t = SendMessage(FindWindow(L"PostMsgTest",NULL), WM_USER_FOO, 0, 0);
    cout << t << "/n";
    
    // und in der Window Procedure im Zielfenster:
    
    case WM_USER_FOO:
      // irgendwelche Befehle ...
      return 5;  // Wert den t haben soll
    


  • Weil du sie nicht genannt hast \o/
    Ich bin relativ neu in C++, komme soweit mit dem Syntax klar.
    Vorher hab ich .NET genutzt. Zurzeit musss ich aber halt C++ nutzen 😉

    Named Pipes schau ich mir mal an. Das gibts ja auch in .net

    Grüße

    /Edit:

    Player, du bist super ^^
    Dein Post kam erst nachdem ich absenden geklickt hab.

    das mit dem Return wusste ich garnicht :o

    Man lernt halt immer dazu 🙂


Anmelden zum Antworten