PostMessage funktioniert nicht



  • Hallo,
    ich möchte eine Textnachricht an ein fremdes Fenster schicken (z.B. den Texteditor):
    Bis jetzt habe ich es mit SetForegroundWindow und keybd_event gelöst; Allerdings ist das für mich nicht die Beste Lösung, da man ja für jeden Buchstabe jeweils ein keybd_event auslösen muss. Als Alternative fand ich:

    PostMessageW(hwnd,WM_SETTEXT,0,(LPARAM) L"Mein Text");
    

    Aber bei mir passiert da gar nichts...; Was hab ich falsch gemacht?

    Schonmal Danke im Voraus!

    Viele Grüße
    sinenomen



  • Hast du schon mal den Rückgabewert überprüft?



  • Ok, der Rückgabewert ist false.
    Also kann wohl auch nichts ankommen^^
    Ist es denn überhaupt möglich mit PostMessage solche Textnachrichten zu senden?
    Oder gibt es noch einen anderen Befehl dafür?

    Viele Grüße
    sinenomen



  • Vermutlich stimmt das hwnd nicht oder es ist via UIPI geschützt... (Vista und höher)



  • Erstmal Danke für deine Antwort!

    Das hwnd ist allerdings korrekt: ich kann mein Zielfenster (z.B. den Texteditor) minimieren mit:

    ShowWindow(hwnd, SW_MINIMIZE);
    

    UIPI kenn ich nicht; Aber mein Betriebssystem ist sowieso Windows XP.

    Ich habe jetzt schon mal ein wenig weiter gesucht und habe mit GetLastError den Fehler 1159 bekommen; Dadurch bin ich auf den Thread gestoßen, wo das gleiche Problem behandelt wurde:http://www.c-plusplus.net/forum/viewtopic-var-t-is-250375.html
    Leider funktioniert die dort genannte Methode von Jochen mit "WM_APP + x" bei mir nicht:
    Ich bekomme zwar jetzt als Rückgabewert true und auch GetLastError ergibt 0, aber es wird immer noch keine Nachricht gesendet 😞

    Hat noch jemand eine Idee oder einen Alternativbefehl?

    Viele Grüße
    sinenomen


  • Mod

    Man kann WM_SETTEXT nicht mit PostMessage senden.

    Die Fehlernummer sagt ganz klar. "Diese Nachricht kann nur mit synchronen Vorgängen verwendet werden."

    Woher weißt Du das die Nachricht WM_APP+x nicht gesendet wird?
    Hast Du es mit Spy++ kontrolliert?
    Bist Du sicher, dass Du die Nachricht auch im richtigen Fenster erweartest?

    Was hast Du denn vor?



  • Eigentlich hatte ich vor ein wenig früher zu posten 🙂
    Zu meinem Problem: Während das Forum down war habe ich folgendes herausgefunden:
    http://www.tutorials.de/forum/c-c/320202-tatstatureingaben-fremdes-fenster-senden.html

    Natürlich benutzen Programme wie Wordpad mehrere Child´s innerhalb ihrer Fenster, wobei keydown im MainWindow vermutlich nur auf bestimmten keys, wie z.B. Esc processed wird.
    Darum kannst du zwar eine keydown message senden, aber processed wird sie nicht, solange nicht das richtige child Fenster den Focus hat.
    Stell dir vor du sendest VK_RETURN ans Programm, während gerade das Menü auf Datei-beenden den Focus hat.

    ➡ Mit PostMessage kann man keine Textnachrichten an z.B. notepad.exe schicken.

    Für die, die es interessiert habe ich noch eine alternative Lösung gefunden:
    http://www.daniweb.com/forums/thread123228.html

    Viele Grüße
    sinenomen

    P.S.: Noch mal Danke für alle Ideen und Tipps!


  • Mod

    Du sprinst von einem Thema zum anderen.
    Nochmal: Du kannst WM_SETTEXT nicht mit PostMessage zusammen verwenden.
    Es geht sehr wohl mit SendMessage!

    Und auch hier ist altbekannt, dass man Tastatureingaben nicht mit WM_KEY... Nachrichten simulieren kann.
    http://blog.m-ri.de/index.php/2007/12/27/die-unsitte-tastatureingaben-mit-wm_keydown-nachrichten-zu-simulieren/

    Das in dem Link SendInput bzw. keybd_input hingweiesen wird ist nur dielogische Folge...

    Was willst Du nun?



  • Ich möchte gerne ein Programm schreiben, welches eine Textnachricht (z.B. "Mein Text") in ein Fenster schreibt (z.B. notepad.exe).
    In deinem Blog steht nun, dass man hierzu Sendinput verwenden müsse.
    Zur Verwendung von Sendinput habe ich folgenden Quelltext gefunden:

    #include <iostream>
    #include<windows.h>
    using namespace std;
    
    int main( int argc , char *argv[] )
    {
    Sleep(1000);
           INPUT InputData;
            int iEvents;
    
        InputData.type = INPUT_KEYBOARD;
        InputData.ki.wVk = 0x41;
    
        iEvents = SendInput (1, &InputData, sizeof(InputData));
    
    system("PAUSE");
    
    }
    

    Der Quelltext funktioniert bei mir aber nicht (vielleicht weil AttachThreadInput nicht verwendet wurde)...

    Ich habe allerdings keine Ahnung wie man AttachThreadInput verwendet.

    Kann vielleicht jemand einen Code posten in dem gezeigt wird wie man AttachThreadInput verwendet?
    Wie kann ich mit Sendinput ganze Textnachrichten senden? Soweit ich es sehe wird in meinem Beispiel nur ein Buchstabe gesendet.

    Viele Grüße
    sinenomen


  • Mod

    Dann lies mal die Anleitung von SendInput!
    http://msdn.microsoft.com/en-us/library/ms646270(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/ms646271(VS.85).aspx

    Deine Strukturen sind doch nur mit Müll gefüllt und damit nicht funktionabel.
    Ist Dir klar, dass nicht initialisierte Variablen einen zufäligen Inhalt haben?
    Der Code ist typisches Beispiel von Garbadge in Garbdage out...

    PS: Wie wäre es mit einem Tutorial über die Grundlagen von C++ und WinAPI bevor Du mit prozessübergreifenden Dingen anfängst.
    PPS: Wenn Du nur Tastatureingaben simulieren willst geht das mit einer Batchsprache wie Autoit/AutoHotkey einfacher.


Anmelden zum Antworten