Überprüfung ob eine Anwendung geöffnet ist
-
Hallo,
wie man ein Programm startet und beendet weiß ich, doch wie überprüft man ob ein Programm bereits läuft?
Danke im voraus,mfg
-
-
FindWindow(const char * ClassName, const char * WindowName)
-
[EDIT] zu langsam, aber trotzdem lesenswert wenn die anwedung kein sichtbares formular hat z.B. durch Application->ShowMainForm = false; [/EDIT]
also laut hilfe
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ); Parameters hInstance [in] Handle to the current instance of the application. hPrevInstance [in] Handle to the previous instance of the application. This parameter is always NULL. If you need to detect whether another instance already exists, create a uniquely named mutex using the CreateMutex function. CreateMutex will succeed even if the mutex already exists, but the function will return ERROR_ALREADY_EXISTS. This indicates that another instance of your application exists, because it created the mutex first.mein vorschlag wäre es in der beziehung in deine cpp datei deines projekts (nicht die MAIN) ein
HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName );mit lpName = Anwedungsname zu wählen und im falle von ERROR_ALREADY_EXISTS die startende anwendung noch vor dem Application->FormCreate() abzuwürgen.
das ist nur eine idee von mir, hab es selber nicht probiert, hab aber ein ähnliches problem, das ich noch ganz anders gelöst habe
-
Wenn ich das richtig verstanden habe geht es ihm aber nicht nur um seine eigenen Programme sondern vor allem um welche die er nicht programmiert hat.
-
wie man ein Programm startet und beendet weiß ich, doch wie überprüft man ob ein Programm bereits läuft?
im kontext der wiederholten verwendung von "ein Programm" kann man das aber auch anders sehen
einigen wir uns auf eine missverständliche Frage ^^ und hoffen auf aufklärung.
-
Hab ich auch so verstanden ... auf welchen Post spielst du denn jetzt an?
FindWindow kann doch auch für "externe" Anwendungen genutzt werden.
Zum Beispiel um die Taskleiste anzusprechen...ShowWindow(FindWindow("SHELL_TRAYWND", NULL), SW_HIDE); //müsste extern genug sein
-
trotzdem gehst du dabei von einem existierenden formular aus!!!
was wenn die applikation aber kein formular hat ?da wir uns hier bei borland vcl aufhalten entfällt diese frage eigentlich fast aber dennoch!!!
ausserdem kann es doch gut sein das die anwendung hängt oder was weis ich noch alles zwischen dem WinMain und dem Application.CreateForm() liegen schon ein paar Zeilen.Ausserdem hab ich das aus der Hilfe gezogen, und die hat mir bisher immer recht brauchbare erfolge beschert.
-
Dann frag ich ab, ob die Anwendung sichtbar oder unsichtbar is...

HWND hWnd = FindWindow("SHELL_TRAYWND", NULL) if (IsWindowVisible(hWnd)) ShowMessage("sichtbar"); //...Edit: Zugegeben, dass funktioniert nur wenn du den exakten Fenstertitel kennst, aber davon geh ich aus, wenn er eine bestimmte Anwendung auf "Existenz" überprüfen will :EditEnde
Ja nee wie auch immer ... er wird schon wissen was er will und sich auch dementsprechend verhalten

mfg, Micha!
-
Wenn man das Programm mit ShellExecuteEx startet, bekommt man ein Prozesshandle mit zurück, welches man auch zu Schließen des Programmes nutzen kann.
-
rean schrieb:
Wenn ich das richtig verstanden habe geht es ihm aber nicht nur um seine eigenen Programme sondern vor allem um welche die er nicht programmiert hat.
Richtig ! Ich will von meinem Programm aus überprüfen ob ein externes Programm, dessen Name mir bekannt ist, ausgeführt wird.
Hab mit diesem Vorschlag von RandomAccess85 mein Problem gerade gelöst:
HWND hWnd = FindWindow("SHELL_TRAYWND", NULL)
if (IsWindowVisible(hWnd))
ShowMessage("sichtbar");
//...danke an alle für die hilfsbereitschaft ( trotz meiner schlechten Fehlerbeschreibung
..was nicht mehr vorkommt ;)) !
-
trotzdem möchte ich zum thema singleton instance was hinterherwerfen, habs grad selber implementiert, funktioniert ganz gut und es zu wissen schadet auch nicht:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE Mutex = CreateMutex(NULL, false, "MyAppInstance"); if (GetLastError() == ERROR_ALREADY_EXISTS) return 0; // try-catch der WinMain mit Application->Run(); usw. CloseHandle(Mutex); // falls ein anderer prozess als der benutzer das programm startet muss der mutex wieder freigegeben werden return 0; }