LPCSTR in LPCWSTR konvertieren
-
okay, das habe ich wahrscheinlich schlecht erklärt:
Ich möchte in meinem Programm den "FindWindows" - Befehl verwenden. Wenn ich nun aber z. B.
HWND hwndEditor = FindWindowA(NULL,"Unbenannt - Editor");
verwende, kommt der Error beim Compilieren, dass der eine Parameter nicht in LPCWSTR konvertiert werden konnte.
Deshalb habe ich versucht den Namen des Fensters (Unbenannt - Editor) vorher als String zu speichern und diesen dann in LPCWSTR zu konvertieren.
-
Wenn du FindWindowA benutzt, solltest du dieses Problem nicht haben, nur wenn du FindWindowW benutzt oder FindWindow ohne Anhängsel in einem Projekt, in dem UNICODE aktiviert ist (Defaulteinstellung).
Prinzipiell gibt es 3 Möglichkeiten:
FindWindowA(nullptr, "Unbenannt - Editor");
FindWindowW(nullptr, L"Unbenannt - Editor");
FindWindow(nullptr, TEXT("Unbenannt - Editor"));
FindWindow an sich ist aber wohl praktisch immer ein Hack. Erklär uns doch mal, was genau du damit erreichen willst.
-
Hacken will ich damit nichts, nur eine Textdatei im Editor beschreiben.
Bisher habe ich das so gemacht:ofstream Textdatei; Textdatei.open("C:\\datei.txt"); Textdatei << "Text"; Textdatei.close;
wobei hier ja die Textdatei neu am angebenen Ort erstellt wird. Nun möchte ich eine bereits als Fenster geöffnete Textdatei beschreiben:
Textdatei öffnen, Programm starten, Programm schreibt etwas auf die Textdatei, Programm ende.
-
Ich versteh nicht ganz, du willst als Ersatz für den Umgang mit std::ofstream notepad.exe fernsteuern!?
Btw: Mit "Hack" meinte ich nicht, dass du was hacken willst, sondern eben, dass es ein Hack ist.
Überleg mal: Selbst wenn man davon ausgeht, dass der Editor sich immer gleich verhalten wird, reicht es schon aus, nur die Systemsprache umzustellen, damit deine Lösung nicht mehr funktioniert...
-
Hm, hast recht, weil dann ja die Fensterbezeichnung nicht mehr erkannt wird.
Ich will gerade nur meine C++ Kentnisse ein wenig über cout in der Konsole oder Textdateien erweitern und schauen, wie man ein Programm mit anderen Fenstern/Dateien interagieren lässt. Der Editor war da nur eine Art Testobjekt.
Wenn ich nun aber irgendein Fenster in den Vordergrund holen will, stolpere ich schon über diese LPCWSTR-Geschichte. Mit "FindWindowA" kommt dann ein anderer Error mit irgendeinem Nicht aufgelöstes Token.
Werde mich da aber selber nochmal schlau lesen.
-
poki schrieb:
Ich will gerade nur meine C++ Kentnisse ein wenig über cout in der Konsole oder Textdateien erweitern und schauen, wie man ein Programm mit anderen Fenstern/Dateien interagieren lässt.
Das ist ganz einfach: Am besten gar nicht bzw. nicht auf diese Art. Das Betriebssystem bietet entsprechende Interprocess Communication Mechanismen, die es zwei Prozessen ermöglichen, miteinander zu interagieren, wenn beide es wünschen. Da bewegen wir uns aber in für einen Anfänger wohl eher schwer zugänglichen Sphären.
Dass die Simulation von Benutzereingaben jedenfall keine brauchbare Lösung ist, dürfte dir mittlerweile ja selbst klar sein. Zu den rein prinzipiellen Problemen damit kommt noch, dass ein modernes Betriebssystem dir dabei zusätzlich Steine in den Weg legt, da die Möglichkeit einer solchen Fernsteuerung anderer Anwendungen über das User Interface ein potentielles Sicherheitsrisiko darstellt...
Wenn du mit deinen C++ Kenntnissen schon fortgeschritten genug bist und einfach nur nach Wegen aus der Konsole suchst, würde ich dir empfehlen, dass du dir SFML (2.0) besorgst und mal ein bisschen damit rumspielst...
-
oder nimm Qt wenn du von der Konsole wegkommen möchtest!
Damit ist es ein Kinderspiel, ein C++ GUI Programm zu erstellen!
-
du machts wahrscheinlich einen Unicode-Build (schau mal in die Projekteinstellungen).
Immer wenn du "FindWindow" schreibst wird "FindWindowW" aufgerufen, da diese Funktion Unicode-Zeichenketten als Parameter entgegennimmt. Bei ANSI-Builds wird "FindWindowA" aufgerufen.
Deine Zeichenkette in der CPP-Datei ist standardmäßig ANSI, also musst du ein L davor setzen, damit der Compiler weiß das es eine WideChar-Zeichenkette ist.
Also schreibst du: FindWindow( nullptr, L"Unbenannt - Editor");
-
CStringA aaa = "blah" ; CStringW www( aaa );
-
Hab es jetzt hinbekommen:
HWND fenster = FindWindow(NULL, L"Unbenannt - Editor");
und mit
SetForegroundWindow(fenster);
konnte ich die Textdatei in den Vordergrund holen.
Danke für die Tipps!