[Need Help]Warten bis ein Fenster offen ist
-
Belli schrieb:
DerNoob1993 schrieb:
Gibt es eine möglichkeit ohne einen Sleep() befehl zu warten ,bis ein Bestimmtes Fenster geöffnet ist?Ich gebe grade mal ein Beispiel da es für viele unverständlich sein wird was ich meine .
System("notepad.exe);
// Now i need a way to wait until the window is open
HWND hwnd = FindWindow(0,L"Editor");Starte das Programm nicht mit System(..., sondern mit CreateProcess, Du bekommst dann ein Prozesshandle und kannst dann mit
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687022(v=vs.85).aspx
warten, bis die Anwendung initialisiert ist.Danke danach habe ich gesucht
Noch ne frage zu CreateProcess() ,da ich bisschen Probleme dabei habe alle Parameter zu verstehen .(CreateProcess(NULL , "Metin2.exe", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)
Wenn ich das hier Eingebe ist der 2te Parameter ( der string "Metin2.exe") rot unterstrichen und es wird mir gesagt der Typ const char ist mit dem Parameter vom Typ LPCWSTR ungültig . Wie kann ich denn nun sonst meinen String ( den namen des Programms welches gestartet werden soll) an die Funktion übergeben ?
-
Hau ein L vor das ""-Literal:
FunctionXY(L"SomeString");
Oder fasse es in TEXT()/_T() ein. Letzeres ist die sauberere Variante, da du den Projekt-Zeichensatz ohne Probleme aendern koenntest. Allerdings sollte dafuer kein Bedarf sein, so dass alle 3 Varianten funktionieren. Such dir eine aus. :p
-
(CreateProcess(NULL , TEXT("Metin2.exe"), NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);
Wobei Du möglicherweise aber auch den vollen Pfad zum Programm angeben musst, also zB TEXT("c:\\Programme\\Spiele\\Metin2"), das hängt davon ab, wo die Datei liegt, wo Dein Programm liegt, wie das aktuelle Arbeitsverzeichnis ist, usw.
Also am besten voll qualifiziert angeben, dann bist Du auf der sicheren Seite.
-
Danke euch beiden das klappt schonmal ^^ allerdings habe ich wohl irgendwo noch was falsch gemacht , da beim ausführen der datei immer ne Fehlermeldung kommt das mein Programm nicht richtig funktioniert
hier ist mal mein testprogramm für die Funktion
#include <iostream> #include <Windows.h> int main() { PROCESS_INFORMATION processInfo ; STARTUPINFO info ; // Create the process CreateProcess(NULL ,L"C:\Metin3\Metin2.exe", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo); std::cin.get(); }
Wenn irgendjemand mir sagen könnte was ich da falsch gemacht habe wäre echt klasse ,da ich grad nicht durchblicke was ich falsch gemacht haben soll
Das hier gibt mein Compiler aus ( er erstellt die Datei aber gibt warnungen aus)
1>------ Erstellen gestartet: Projekt: CreateProcFunc, Konfiguration: Debug Win32 ------
1> CrateProcFunc.cpp
1>c:\users\marius\documents\visual studio 2010\projects\createprocfunc\crateprocfunc.cpp(14): warning C4129: 'M': Nicht erkannte Folge von Escapesequenz
1>c:\users\marius\documents\visual studio 2010\projects\createprocfunc\crateprocfunc.cpp(14): warning C4129: 'M': Nicht erkannte Folge von Escapesequenz
1> CreateProcFunc.vcxproj -> C:\Users\Marius\Documents\Visual Studio 2010\Projects\CreateProcFunc\Debug\CreateProcFunc.exe
========== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ==========
-
Mit dem Prozesshandle kannst Du übrigens auch sehr einfach auf das Ende des entsprechenden Prozesses warten (ich meine, diese Anforderung von Dir in einem anderen Thread gesehen zu haben - falls nicht, einfach ignorieren):
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx
-
Mit \ sagst du dem Compiler, dass du Sonderzeichen willst. '\n' ist zum Beispiel ein Newline-Zeichen. Er weiß aber nicht was \M ist. Du willst \\ statt \ benutzen, das bedeutet dann, dass es das echte Zeichen \ und nicht das Sonderzeichen ist.
L"C:\\Metin3\\Metin2.exe"
-
nwp3 schrieb:
Mit \ sagst du dem Compiler, dass du Sonderzeichen willst. '\n' ist zum Beispiel ein Newline-Zeichen. Er weiß aber nicht was \M ist. Du willst \\ statt \ benutzen, das bedeutet dann, dass es das echte Zeichen \ und nicht das Sonderzeichen ist.
L"C:\\Metin3\\Metin2.exe"Hmm dadurch sind die Compiler warnungen verschwunden schonmal ,allerdings kommt immernoch die Meldung beim ausführen ,Blablabla.exe funktioniert nichtmehr.
Iwas muss immernoch falsch sein
-
Du musst Info bzw. prozessinfo sinnvoll initialisieren.
-
Eine Möglichkeit zu warten bis das Fenster geöffnet ist, ist es, zu warten bis FindWindow eine hWnd zurückgibt...
while(!(hWnd = FindWindow("",""))) Sleep(100); // Hier wurde das Fenster schon gefunden DoSomething();
-
belli_off schrieb:
Du musst Info bzw. prozessinfo sinnvoll initialisieren.
Wieso muss ich sie initialisieren, und vor allem mit welchem Wert?
Die Variable ProcessInfo ist doch nur dafür da die ProcId aufzunehmen so wie ich es verstanden habe ,weshalb muss ich sie dann initialisieren eine Definition sollte doch ausreichend seinIch frage ungerne nach Beispielen ,da ich es lieber von mir aus löse ,aber in diesem Fall wäre es echt super ,wenn mir jmd ein Beispiel zu der CreateProc Funktion posten könnte ,damit ich es mir angucken und verstehen kann was ich falsch gemacht habe,denn im moment bin ich aufgrund der langen Parameterliste ,und den ganzen neuen Typen der WinApi leicht überfordert,und verstehe nicht was ich falsch gemacht habe.
-
http://www.c-plusplus.net/forum/248213?highlight=pipe
guck mal darein, da benutze ich irgendwo CreateProcess
Du solltest mindestens die Startupinfo - Struktur mit Nullen füllen und die Strukturgröße ins erste Member eintragen.
Hab Grad keinen PC, mehr kann ich deshalb erst morgen beitragen.
Aber wahrscheinlich reicht Dir das Beispiel aus dem og Thread.
-
Okay, hier ein vollständiges Beispiel:
#include <windows.h> #include <iostream> int main() { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); CreateProcess(NULL, "notepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForInputIdle(pi.hProcess, INFINITE); std::cout << "Gestartet\n"; WaitForSingleObject(pi.hProcess, INFINITE); std::cout << "Beendet\n"; }
-
So vollständig ist das Bsp. auch nicht.
Was machst Du wenn WaitForInputIdle WAIT_FAILED zurückgibt?
-
Belli schrieb:
Okay, hier ein vollständiges Beispiel:
#include <windows.h> #include <iostream> int main() { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); CreateProcess(NULL, "notepad.exe", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); WaitForInputIdle(pi.hProcess, INFINITE); std::cout << "Gestartet\n"; WaitForSingleObject(pi.hProcess, INFINITE); std::cout << "Beendet\n"; }
Ich danke dir vielmals, das seltsame ist habe deineBeispiel grade einmal 1:1 in mein Visual C++ 2010 Kopiert und versucht zu Compilen ,und es kommt wieder die Fehlermeldung :
Konvertierung des Parameters 2 von 'const char [12]' in 'LPWSTR' nicht möglich . Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
daraufhin versuchte ich den Text mit dem L und danach der TEXT() Funktion zu übergeben woraufhin wieder keine Compiler Fehler kahmen ,beim ausführen des Programms jedoch kommt weiterhin die Meldung das Programm wird nicht richtig ausgeführt.
Daraufhin habe ich das Beispiel mal in meine Dev C++ kopiert ,kompilliert und siehe da weder eine Compiler warnung noch die Fehlermeldung beim ausführen ,und Notepad.exe öffnet sich
Hat jmd noch ne Idee wie ich in Visual C++ 2010 den Text übergeben kann ,so dass das Programm später auch funktioniert ?^^
Ich meine zur not nehm ich Dev C++ ,aber die Visual c++ entwicklungsumgebung finde ich deutlich angenehmer zum Programmieren als Dev C++.
-
DerNoob1993 schrieb:
Ich danke dir vielmals, das seltsame ist habe deineBeispiel grade einmal 1:1 in mein Visual C++ 2010 Kopiert und versucht zu Compilen ,und es kommt wieder die Fehlermeldung : [code="cpp"]Konvertierung des Parameters 2 von 'const char [12]' in 'LPWSTR' nicht möglich .
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Das liegt an Deinen Projekteinstellungen, Du hast ein UNICODE-Projekt, deshalb musst Du Stringliterale als L("...) (oder universell als TEXT("...) schreiben, ich übersetze als Multibyte - Projekt.
daraufhin versuchte ich den Text mit dem L und danach der TEXT() Funktion zu übergeben woraufhin wieder keine Compiler Fehler kahmen ,beim ausführen des Programms jedoch kommt weiterhin die Meldung das Programm wird nicht richtig ausgeführt.
Mhm, wird es denn überhaupt gelinkt? Wird eine exe-Datei erstellt? Falls nicht, musst Du im Projekt evtl. noch explizit die user32.lib als mitzulinkende Datei einstellen.
Alternativ kannst Du ja mal versuchen, aus der VS - Konsole zu übersetzen/linken:
Start/Programme/Visual C++ .../Visual Studio Tools/Visual Studio Eingabeaufforderung
dann in das Verzeichnis navigieren, in dem die Quelldatei steht, dann:
cl /EHsc progname.cpp user32.lib
dann musst Du allerdings die Strings wieder so schreiben wie in meinem Beispiel oben, oder eben universell mit TEXT("progname.exe")
-
Belli schrieb:
DerNoob1993 schrieb:
Ich danke dir vielmals, das seltsame ist habe deineBeispiel grade einmal 1:1 in mein Visual C++ 2010 Kopiert und versucht zu Compilen ,und es kommt wieder die Fehlermeldung : [code="cpp"]Konvertierung des Parameters 2 von 'const char [12]' in 'LPWSTR' nicht möglich .
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Das liegt an Deinen Projekteinstellungen, Du hast ein UNICODE-Projekt, deshalb musst Du Stringliterale als L("...) (oder universell als TEXT("...) schreiben, ich übersetze als Multibyte - Projekt.
daraufhin versuchte ich den Text mit dem L und danach der TEXT() Funktion zu übergeben woraufhin wieder keine Compiler Fehler kahmen ,beim ausführen des Programms jedoch kommt weiterhin die Meldung das Programm wird nicht richtig ausgeführt.
Mhm, wird es denn überhaupt gelinkt? Wird eine exe-Datei erstellt? Falls nicht, musst Du im Projekt evtl. noch explizit die user32.lib als mitzulinkende Datei einstellen.
Alternativ kannst Du ja mal versuchen, aus der VS - Konsole zu übersetzen/linken:
Start/Programme/Visual C++ .../Visual Studio Tools/Visual Studio Eingabeaufforderung
dann in das Verzeichnis navigieren, in dem die Quelldatei steht, dann:
cl /EHsc progname.cpp user32.lib
dann musst Du allerdings die Strings wieder so schreiben wie in meinem Beispiel oben, oder eben universell mit TEXT("progname.exe")Das seltsame ist es wird wenn ich den string mit L "" oder TEXT("") übergeben will kein Fehler angezeigt ,und es wird auch eine ausführbare .exe Datei erstellt ,sobald ich diese aber starte kommt die Fehlermeldung
"Projektname.exe funktioniert nichtmehr es wird nach einer Lösung für das Problem gesucht" .
-
Wie gesagt, dass Du L oder besser TEXT vor Deine Strings schreiben musst, ist nicht seltsam, das liegt an Deinen Projekteinstellungen!
Wenn Du das hinzufügst, wird auf jeden Fall schon mal kompiliert, das heißt aber nicht, dass auch gelinkt wird.
Sieh doch mal nach, ob eine exe - Datei überhaupt erstellt wird, falls nicht, siehe mein letztes Posting.
-
Belli schrieb:
Wie gesagt, dass Du L oder besser TEXT vor Deine Strings schreiben musst, ist nicht seltsam, das liegt an Deinen Projekteinstellungen!
Wenn Du das hinzufügst, wird auf jeden Fall schon mal kompiliert, das heißt aber nicht, dass auch gelinkt wird.
Sieh doch mal nach, ob eine exe - Datei überhaupt erstellt wird, falls nicht, siehe mein letztes Posting.Wie gesagt es wird ne .exe erstellt ,und es kommen sobald ich mit TEXT("") oder L"" den String übergebe keine Fehlermeldungen .
Wenn ich nun aber die exe welche erstellt wurde ausführen will kommt nur die Fehlermeldung " Projektname.exe funktioniert nichtmehr es wird nach einer Lösung für das Problem gesucht " und nein das seltsame ist nicht wie ich die Strings übergeben muss das ist mir relativ klar warum ,das seltsame ist dass eine .exe Datei ohne Compiler Warnungen erstellt wird welche beim ausführen aber die oben genannte Windows Fehlermeldung ausgibt. Wie gesagt bei Dev c++ geht alles einwandfrei es liegt scheinbar an irgendeiner einstellung meines Compilers :p
-
Versuch doch mal, die exe aus der Konsole heraus zu erstellen, wie oben beschrieben. In der IDE sind ja jede Menge Einstellungen oder eben auch nicht, die möglicherweise nicht so einfach alle zu überprüfen sind.
Beim Erstellen aus der Konsole hast Du dieses 'Problem' erst mal nicht.
-
Belli schrieb:
Versuch doch mal, die exe aus der Konsole heraus zu erstellen, wie oben beschrieben. In der IDE sind ja jede Menge Einstellungen oder eben auch nicht, die möglicherweise nicht so einfach alle zu überprüfen sind.
Beim Erstellen aus der Konsole hast Du dieses 'Problem' erst mal nicht.Ohje sowas hab ich noch nie gemacht dummerweise arbeitet mein Buch (C++ Primer)
nicht mit einer bestimmten IDE ,weshalb ich mich mit meinem Compiler noch nicht so gut auskenne ich denke mal ich werde dieses Projekt einfach mit Dev C++ erstellen ,da ich lieber erstmal die Sprache richtig lernen will bevor ich mich auch noch mit meinem Compiler auseinandersetze
Ich danke euch allen echt vielmals für die Hilfe