Dauerhaft nach Fenster mit FindWindow suchen
-
Guten Tag meine Damen und Herren
Ich versuche ein Programm zu schreiben welches dauerhaft überprüft ob ein bestimmtes Fensterhandle noch geöffnet ist ,habe dabei allerdings meine Probleme,denn er sucht nicht dauerhaft nach dem handle ,sondern nur 1x und wenn das fenster geschlossen wird wird keine meldung ausgegeben ,dass es geschlossen wurde.
Ich habe es mit einer Schleife probiert hier mal ein Beispiel wie ich mir das ganze vorgestellt habe :HWND Fenster
bool a = true
System("Gamename");
while(bool a = true)
{
Fenster = FindWindow(0,L"GAMENAME");
if (Fenster)
{
// Do nothing
}else {
cout << "Fenster wurde geschlossen" << endl;
System ("Gamename");
}Nun bräuchte ich am besten einen Weg um wieder in die while schleife von oben zu gelangen ,damit er nachdem das Fenster z.B.durch einen Fehler geschlossen wurde erst von selbst mittels System("") das Spiel neu gestartet wird, und er danach wieder in die die schleife gelangt wo dauerhaft nach dem Fenster gesucht werden soll ,falls sich das Fenster erneut durch einen Fehler schließen sollte.
Wöre klasse wenn mir jmd ein Beispiel ,oder nen Tipp geben würde wie ich das anstellen kann.
Das ganze hat den Sinn ,dass ich einen Relogger machen möchte ,und dafür muss ich wenn das Fenster einmal offen ist dauerhaft kontrollieren ,ob es auch immernoch geöffnet ist.
-
WinAPI-Forum wäre besser gewesen.
Wenn du bereit bist das mit den Fenstern sein zu lassen kannst du CreateProcess statt system benutzen. Das gibt dir dann ein Prozess-Handle. Den kannst du dann WaitForSingleObject geben um darauf zu warten, dass sich der Prozess beendet.
-
DerNoob1993 schrieb:
HWND Fenster bool a = true System("Gamename"); while(bool a = true) { Fenster = FindWindow(0,L"GAMENAME"); if (Fenster) { // Do nothing } else { cout << "Fenster wurde geschlossen" << endl; System ("Gamename"); }
Nun bräuchte ich am besten einen Weg um wieder in die while schleife von oben zu gelangen
Deine while-Schleife wird doch gar nicht verlassen?!
Allerdings siehst Du bei vernünftiger Einrückung, dass eine } fehlt ...
-
Belli schrieb:
DerNoob1993 schrieb:
HWND Fenster bool a = true System("Gamename"); while(bool a = true) { Fenster = FindWindow(0,L"GAMENAME"); if (Fenster) { // Do nothing } else { cout << "Fenster wurde geschlossen" << endl; System ("Gamename"); }
Nun bräuchte ich am besten einen Weg um wieder in die while schleife von oben zu gelangen
Deine while-Schleife wird doch gar nicht verlassen?!
Allerdings siehst Du bei vernünftiger Einrückung, dass eine } fehlt ...Belli schrieb:
DerNoob1993 schrieb:
HWND Fenster bool a = true System("Gamename"); while(bool a = true) { Fenster = FindWindow(0,L"GAMENAME"); if (Fenster) { // Do nothing } else { cout << "Fenster wurde geschlossen" << endl; System ("Gamename"); }
Nun bräuchte ich am besten einen Weg um wieder in die while schleife von oben zu gelangen
Deine while-Schleife wird doch gar nicht verlassen?!
Allerdings siehst Du bei vernünftiger Einrückung, dass eine } fehlt ...Du hast absolut Recht hatt grad i-wie nen Denkfehler und habe i-wie gedacht er würde die Schleife verlassen mir gehen zuviele überlegungen durch den Kopf wie ich das nun anstellen soll^^.
Und ja stimmt es fehlt die schließende Klammer der while schleife in meinem Programm ist es richtig gemacht habs hier nur grad schnell als Beispiel hingeschrieben und dabei ne Klammer vergessen
Zu deinem Vorposter :ich habe mir die WaitForSingleObject funktion mal angeguckt ,allerdings bin ich noch unsicher dabei wie ich jetzt mi9t dem Rückgabewert arbeite, denn laut msdn sind die Rückgabewerte z.B.WAIT_OBJECT_0
oder WAIT_FAILED ich kann mir aber ja nur eine DWORD Zahlencombi ausgeben lassen welche bei mir etwas wie 4294967295 ist , da stimmt wohl was noch nicht
Also:Mein Veruschs Quelltext sieht so aus wär nett wenn mir dabei nochmal jmd helfen könnte was ich falsch mache ^^.#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;int main()
{
DWORD a ;
system("start.bat");
Sleep(10000);
HANDLE Fensterhandle;
Fensterhandle = FindWindow (0,L"METIN2");a = WaitForSingleObject(Fensterhandle,0);
cout << a <<endl;cin.get();
}
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du kannst nicht auf Fenster warten, deswegen wird WaitForSingleObject(Fensterhandle,0) nicht funktionieren. Du brauchst den Prozess, und den kriegst du mit CreateProcess, mit system nicht. Man kann sicherlich das Fenster finden und dann darüber irgendwie den Prozesshandle und dann darauf warten, aber das geht auch einfacher.
WAIT_OBJECT_0 und WAIT_FAILED sind Zahlen. Allerdings ist es anstrengend sich zu merken welche Zahlen was bedeuten, deswegen hat man den Zahlen Namen gegeben.
Du kannst bei msdn nachsehen was die Konstanten und Funktionen bedeuten und wie man sie benutzt. Dann findet man Seiten wie diese, wo steht, dass WAIT_OBJECT_0 gleich 0 und WAIT_FAILED gleich 0xFFFFFFFF ist. Aber die Zahl ist eigentlich völlig egal, ich würde sowas machen:switch (WaitForSingleObject(prozesshandle, INFINITE)){ default: case WAIT_FAILED: cout << "error\n"; break; case WAIT_OBJECT_0: cout << "jetzt ist er weg\n"; break; }
In der Dokumentation zu WaitForSingleObject steht dann auch gleich warum du da INFINITE und nicht 0 als zweiten Parameter für WaitForSingleObject hinschreiben willst.
-
Ich würde es nur einmal mit FindWndow suchen und dann mit IsWindow kontrollieren ob es noch existiert.
Man kann sich theoretisch natürlich auch per CBT Hook in den Prozess hängen um die Zerstörung genaumit zu bekommen.
-
Martin Richter schrieb:
Ich würde es nur einmal mit FindWndow suchen und dann mit IsWindow kontrollieren ob es noch existiert.
Man kann sich theoretisch natürlich auch per CBT Hook in den Prozess hängen um die Zerstörung genaumit zu bekommen.
Ich danke dir vielmals das war ne sehr einfache Lösung die einwandfrei funktioniert sollte jmd mal ein ähnliches Problem haben ist hier mal mein Code zur Lösung :
#include <iostream>
#include <Windows.h>int main ()
{ int e;
HWND hwnd = FindWindow(0,L"Solitär");
if (hwnd)
{
std::cout << hwnd << std::endl;
std::cout << "sucess" <<std::endl;
while ( e = IsWindow(hwnd))
{
if ( e > 0)
{
std::cout << "Fenster Da" << std::endl;
Sleep(1000);
}
else
{
std::cout << "Fenster wurde geschlossen " << std::endl;}
}
std::cout << "Fenster wurde zugemacht" << std::endl;}
else
{
std::cout << hwnd << std::endl;
std::cout <<"Fail"<< std::endl;
}std::cin.get();
}Vlt nicht der schönste aber er tut seine Arbeit einwandfrei danke an euch alle der Thread kann nun gerne geclosed werden :=)