kann window nicht finden
-
hi,
ich hab ma in der faq nachgeguckt und gesehen, dass man mit CreateSemaphore()
ein prozess starten kann, den man mit FindWindow() wieder finden kann.
was mache ich falsch?HANDLE mhandle; mhandle = CreateSemaphore(NULL, 0, 1, "testsem"); if(GetLastError() == ERROR_ALREADY_EXISTS) { HWND mhwnd; mhwnd = FindWindow("testsem", 0); if(mhwnd == NULL) { MessageBox(NULL, "kann nicht gefunden werden", "", MB_OK); } SendMessage(mhwnd, WM_CLOSE, NULL, NULL); }danke schonma im vorraus
-
Mit CreateSemaphore erzeugst du ein Semaphore-Obejct, das hat mit nem Fenster nichts zu tun.
Einen Process startest du mit CreateProcess.
-
hab das jetzt mit
CreateProcess( NULL, "testsem", NULL, NULL, FALSE,0, NULL, NULL, &si, &pi);gemacht, aber der bringt jetzt eben kein fehler, wenn der process schon existiert. hab ich die creationflag falsch gesetzt?
wenn ja, wie muss ich sie setzen?
-
Was hast denn eingtlich vor !?!?
Was ist diese testsem? Eine anders Programm das du starten willst?
Oder sillst du einfach nur ein einster in deinem Prog anzeigen (CreateWindow)
-
ich will einfach nur testen, ob das programm schon offen ist.
wenn ja, soll er den alten prozess schliesen.
ich weiß da gibts was in der faq, aber da bin ich nicht schlau draus geworden
-
Probiers mal damit, bei uns funktioniert das gut.
// In IchLebSchonMutex sollte z.B der Programmname eingetragen werden
HANDLE hMutex; hMutex = CreateMutex( NULL, // no security descriptor FALSE, // mutex not owned "IchLebschon_Mutex"); // object name ProgName_Mutex if (hMutex == NULL) printf("CreateMutex error: %d\n", GetLastError() ); else if ( GetLastError() == ERROR_ALREADY_EXISTS ) { MessageBox(0,"CreateMutex opened existing mutex\n Applikation Starter is already started", "ERROR",MB_ICONERROR|MB_OK|MB_SETFOREGROUND|MB_APPLMODAL ); exit(1); }Viel Spaß
PS Weis einer wie ich an eine Liste aller Mutexe die im System definiert sind rankomme?
-
danke funzt super,
aber wie kann ich jetzt noch machen, dass ich den prozess auch beenden kann?
kann ich des einfach mit terminate process machen?
-
welchen?
den aktuellen, das passiert sowieso durch das exit 1
den anedren, da muss man mal ein bisschen überlegen
-
naja, das exit(1) schliest ja das ganze programm, aber ich will ja danach noch mehr code haben, oder schliest das in dem fall nur den prozess?
-
Das Programm ist der Process, somit ist deine Frage nicht besonders sinnvoll.
Wenn du etwas anderes tun willst, machs doch vor dem exit(1)
Das exit ist hier nicht essentiell, sondern nur das was wir hier tun wollten.Das Beispiel ist bei uns im Ensatz um sicher zu stellen das dieses Programm genau einmal läuft, wird es ein zweitesmal gestartet, so beendet sich sich unmittelbar selbst mit einer Fehlermeldung.
Der Rest ist doch normale C/C++ -Programmierung
if (xxxx) { tue a } else { tue b }
-
ich hab noch eine andere exe mit
CreateProcess() gestartet.
Wie kann ich den prozess dieser exe terminieren?
Ich brauch für TerminateProcess ja ein handle auf den prozess .. den bekomm ich aber doch nicht von createprocess?
-
.. den bekomm ich aber doch nicht von createprocess?
Was soll dann der letzte Parameter?
TerminateProcess ist nicht zu empfeheln. Das ist das selbe als wenn du das prog mit dem Processfenster im Tasmanager rauskickst. Es wird auf der Stelle gekillt ohne irgendwas aufräumen/freigeben zu können. Wenn das Prog das du schließen willst ein Fenster hat wäre ein WM_CLOSE eher zu empfehlen.
-
und wie kann ich sonst den handle rausfinden?
wenn der prozess schon läuft, bevor mein programm aufgerufen wird?
-
also findwindow funktioniert da nicht, da es kein offenes Fenster ist.
-
crash0r schrieb:
also findwindow funktioniert da nicht, da es kein offenes Fenster ist.
dann nehmt halt enumwindows ..
-
was mach ich wenn es ein Consolenprogramm ist ohne eine Ausgabe auf die console?
WM_CLOSE kennen Consolenprogramme nicht
TerminateProcess ist zu hartWie beendet man ein solches Programm.
-
Warum sollte DAS FENSTER IN DEM Consolenprogramme laufen keine WM_CLOSE kennen? Wir sind hier im WinAPI forum.. die Console läuft bei uns in einem Fenster und das kennt normalerweise WM_CLOSE

-
was solln des sein?
der scannt doch auch nur aktive bzw. sichtbare fenster
-
oh scheise, sry, da waren ja schon neue einträge o_O
-
ne mein programm läuft im hintergrund..da gibts keine console oder fenster
