2016-08-20 6 views
2

Я использую Mutex, чтобы ограничить мое приложение только одним экземпляром. Это код:Как активировать уже открытое приложение, когда пользователь пытается запустить его во второй раз?

HANDLE hMutex; 
hMutex = CreateMutex(NULL, FALSE, "MyTestApp"); 

if(hMutex == NULL) 
    ShowMessage(GetLastError()); 
else 
    if(GetLastError() == ERROR_ALREADY_EXISTS) { 
     ShowMessage("Application already running!"); 
     // activate already running instance ?! 
    return -1; 
    } 

Я бы хотел его расширить, чтобы активировать уже запущенный экземпляр. Как это сделать? Благодарю.

+0

Что вы подразумеваете под "активированием"? Если он уже запущен, он уже не активен? – Galik

+0

Возможно, вы получите HWND и 'SetForegroundWindow'? В этом случае вы можете использовать «EnumWindows». –

+0

@Galik «активировать» Я имею в виду, что уже запущенный экземпляр отображается на экране, даже думал, что он может быть сведен к минимуму и т. Д. – Tracer

ответ

1

Предполагая, что это приложение Win32: 1) Используйте функцию FindWindow с вашим именем окна и именем своего класса. 2) Используйте SetForegroundWindow с возвратом HWND FindWindow.

+0

Новый и уже запущенный экземпляр имеет тот же заголовок, который является проблемой при перечислении окон. – Tracer

+1

Каждый раз, когда запускается новый экземпляр, проверьте, существует ли экземпляр с таким именем. Если это так, сделайте это другим, например, добавив число в строку, представляющую имя класса window/window. (std 'stoi' может быть полезен). – Brackets

+0

Просто идея, на самом деле не рациональная. – Brackets

0

После того, как вы определили, что ни один другой экземпляр приложения не работает, перегрузите WndProc вашей основной формы дескриптор уникального сообщения (например, const unsigned int myMsgId = WM_USER + 100;), или вы можете использовать RegisterWindowMessage. Когда начинается второй экземпляр приложения, передайте сообщение с этим идентификатором сообщения PostMessage(NULL, myMsgId, 0, 0) перед созданием основной формы и завершением работы. 1-й экземпляр приложения может реагировать на него и выходить на передний план с использованием BringWindowToTop (если это возможно, Vista и выше не позволяют это по понятным причинам). Если перенос приложения на передний план не разрешен, значок панели состояния вашего приложения начнет мигать, чтобы привлечь внимание пользователя.

Sam