FindWindow mit Variablen



  • Hallo liebe Freunde,

    ich habe ein kleines Problem.

    hWnd = FindWindow(NULL,L"Paint" );
    

    Ich möchte gerne statt - L"Paint" eine Variable ersetzen.

    string titles;
    
    cout<<"Enter your Window";
    cin >> title;
    hWnd = FindWindow(NULL,L + title);
    

    das funktioniert nicht irgendwie ... weil er immer dieses L davor erwartet .. 😞
    Kann mir jemand bitte helfen ?

    Mfg Setupexe



  • FindWindowA(NULL, title.c_str());

    und jetzt informierst du dich noch was das A zu bedeuten hat und was c_str macht



  • Stell Dein Projekt von UNICODE auf MBCS um, dann benötigst Du kein L mehr vor String/Zeichen - Literalen.

    title.c_str() musst Du natürlich trotzdem benutzen, weil die Funktion einen C-String als Parameter erwartet und nicht ein string-Objekt.



  • Oder sieh dir wstring, wcin und wcout an. Umlaute benutzen können hat Vorteile.



  • KN4CK3R schrieb:

    FindWindowA(NULL, title.c_str());

    und jetzt informierst du dich noch was das A zu bedeuten hat und was c_str macht

    👎

    AFAIK gibt es bei der Windows API Funktionen die empfindlich auf diesen Lösungsansatz reagieren.

    Belli schrieb:

    Stell Dein Projekt von UNICODE auf MBCS um, dann benötigst Du kein L mehr vor String/Zeichen - Literalen.

    title.c_str() musst Du natürlich trotzdem benutzen, weil die Funktion einen C-String als Parameter erwartet und nicht ein string-Objekt.

    👍

    Oder nimm halt eine korrekte Konvertierung vor, siehe diese beiden Posts:
    http://www.c-plusplus.net/forum/p1972600#1972600
    http://www.c-plusplus.net/forum/p1850229#1850229



  • AFAIK gibt es bei der Windows API Funktionen die empfindlich auf diesen Lösungsansatz reagieren.

    Kannst DU das mal näher erläutern ? Ich kenn viel code der sowas ähnliches macht .... also ich meine mit den A funktionen in verbindung mit stl strings.
    Was soll daran "schlimm" sein ?
    FindWindow wird doch ueber den Preprozessor soweiso auf FindWindowA gemacroed !

    Ob FindWindow toll ist, weiss ich ned ^^

    Wenn er selber für den Zeichensatz verantwortlich ist, also nicht irgendwie abhaengig von anderen Projecten und dann mit denen mitswitchen muss, isses doch eh besser er wählt den Zeichensatz definiert aus und entscheidet sich bewusst für:
    std::string und A funktionen
    oder
    std::wstring und W funktionen

    dieses TCHAR gemakroe macht eh nur sinn, wenn das ganze Framework mitspielt, ala Mfc mit CString und so ...

    Und wenn er unbedingt in dem Reigen mit den Makros mitspielen will sollt er
    auch konsequent TCHAR verwenden, also sowas wie :

    typedef std::basic_string<TCHAR> TStdString; oä verwenden ...
    und auch schön alle string literale mit _T("Text") definieren.

    Bei deinem Vorschlag fliegt sein programm schon auf die Nase, wenn irgend nen Scherzbold mal _UNICODE definiert ^^

    Ciao ....



  • theta schrieb:

    KN4CK3R schrieb:

    FindWindowA(NULL, title.c_str());

    und jetzt informierst du dich noch was das A zu bedeuten hat und was c_str macht

    👎

    AFAIK gibt es bei der Windows API Funktionen die empfindlich auf diesen Lösungsansatz reagieren.

    ja, wieso sollte es falsch sein A aufzurufen, auch wenn der Rest W verwendet? Intern wird FindWindowA den String in Unicode umwandeln und auch W aufrufen. Dass die wahrscheinlich bessere Lösung ist, das Projekt gleich auf MBCS umzustellen, war meine Hoffnung beim "Informier dich über das A" Hinweis.



  • Erstmal vielen dank für eure Antworten,Freunde. 🙂
    Muss ehrlich sagen,dass es alles gerade eine Informationsflut für mich ist^^

    Fehler2 error C2664: 'FindWindowW': Konvertierung des Parameters 2 von 'const char *' in 'LPCWSTR' nicht möglich
    

    Diese Fehlermeldung kommt,wenn ich es mit dem .c_str() kompiliere.
    Ich weiß nicht,ob ich es richtig gemacht habe,ich habe einfach ein neues Projekt unter Visual Studio erstellt und habe MFC projekt erstellt,wegen MBCS.

    Die anderen Methoden habe ich auch versucht,aber auch ohne Erfolg!



  • Habe die Lösung freunde!

    Belli schrieb:
    Stell Dein Projekt von UNICODE auf MBCS um, dann benötigst Du kein L mehr vor String/Zeichen - Literalen.

    title.c_str() musst Du natürlich trotzdem benutzen, weil die Funktion einen C-String als Parameter erwartet und nicht ein string-Objekt.

    Ich habe einfach Unicode ausgeschaltet und dann hat es funktioniert! 🙂 🙂 🙂

    Vielen Dank an euch allen ! 🙂


Anmelden zum Antworten