Eigene Applikation aktivieren

15/06/2008 - 21:38 von Thomas Steinbach | Report spam
Hallo NG,

ich moechte das eigene Window aktivieren wenn es in
einer zweiten Instanz versucht wird zu starten.
Diese gestartete Instanz bemerk das die App
schon laueft und soll dann ein PosMessage - quasi
an sich selbst, bzw. alle TopLevel-Windows und damit
auch an die erste Instanz schicken.

ich habe bisher:
snipp
...
#define WM_APP_ACTIVATEAPP WM_APP+1
...
int APIENTRY WinMain(HIN)
{
HANDLE hMutex, tmpMutex;
...
hMutex = CreateMutex(NULL, TRUE, _TEXT("Win32TestTool"));
if( GetLastError() == ERROR_ALREADY_EXISTS ) {
tmpMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE,
_TEXT("Win32TestTool"));
if(tmpMutex) {
MessageBox(NULL, "nun zu aktivieren", "Title",
MB_OK|MB_ICONINFORMATION);
}
//uMsgReg = RegisterWindowMessage("WM_APP_ACTIVATEAPP");
PostMessage(HWND_BROADCAST, WM_APP_ACTIVATEAPP,
(WPARAM)NULL, (LPARAM)NULL);
//ShowWindow(tmpHandle, SW_NORMAL); // geht ja so nicht, weil es ja
// das Handle der Mutex-Variablen und nicht des
Fensters ist.
CloseHandle(tmpMutex);
CloseHandle(hMutex);
return 1;
}
...
return 0;
}
snapp

um spaeter in der Messageloop bei WM_COMMAND
dann das selbst definierte WM_APP_ACTIVATEAPP
abzufangen und dann (in der ersten Instanz) ein
ShowWindow(hWnd, SW_NORMAL);
zu machen.

Aber irgendwie klappt das mit der systemweiten Message so nicht
btw: Vista

Wer kann mir da helfen. Ich steige da gerade noch nicht
so ganz durch mit den systemweiten Messages und auch
mit dem registrieren eigener Messages laeuft. Wieso muss
ich da einen _String_ registrieren? Die Messages sind doch
einfach UINT?

Thomas
 

Lesen sie die antworten

#1 Thomas Steinbach
15/06/2008 - 22:58 | Warnen spam
Hallo Volker,

[...]



Du brauchst dazu keine eigene Message. Es genügt, wenn Du das Fenster
mit der richtigen Klasse suchst (z.B. mit FindWindowEx()
http://msdn.microsoft.com/en-us/library/ms633500(VS.85).aspx ) und das
aktivierst.



Gute Idee, Danke. Habe jetzt folgendes

hWnd = FindWindow(szWindowClass, NULL);
ShowWindow(hWnd, SW_NORMAL);
//PostMessage(hWnd, SC_RESTORE, (WPARAM)NULL, (LPARAM)NULL);

Allerdings haut das ganze nicht so hin wie ich es mir erhofft hatte.

Kurz zum Hintergrund:
Ich habe bei meiner App ein Trayicon hinzugekloeppelt und wenn ich die
App minimiert habe (WM_SYSCOMMAND / SC_MINIMIZE) und die
App eben nicht mehr in der Taskleiste auftaucht, dann wird durch ein

ShowWindow(hWnd, SW_NORMAL);

in der WinMain der zweiten Instanz das angesprochene Fenster
(eben die erste Instanz) _nicht_ wiederhergestellt.
Auch SW_RESTORE oder andere Kombinationen funktionieren nicht
Ich habe auch versucht mit PostMessage (auskommentiert) ein
SC_RESTORE zu senden, um bei WM_SYSCOMMAND mit

case SC_RESTORE:
ShowWindow(hWnd, SW_NORMAL);
break;

die App zu aktivieren, bzw. wiederherzustellen
und in den Vordergrund zu bringen.Funktioniert aber auch nicht :-(

Hast du da eventuell noch eine Idee?

btw: Noch 'ne Frage an die Windows Profis hier:
Ist das erstellen einer MutexVariable (CreateMutex())
eigentlich _das_ Mittel um mehrfache Instanzen einer App
zu verhindern?

Thomas

Ähnliche fragen