Ограничить приложение одним экземпляром на сеанс оболочки в Windows

Существует множество решений для ограничения двойного запуска приложения. Поиск по имени процесса, использование именованного мьютекса и т. д. Но все эти методы не работают, если я хочу ограничить свое приложение сеансом оболочки.

У пользователя может быть больше, чем сеанс входа в систему и оболочка в Windows (правильно?)? Если это правда, я хочу иметь возможность запускать один экземпляр моего приложения в каждом сеансе оболочки, но разрешать только один.

Есть ли способ получить идентификатор оболочки, который затем можно было бы поместить в имя мьютекса?


person Wienczny    schedule 17.02.2010    source источник


Ответы (4)


Вы можете создавать локальные (только для сеанса) или глобальные (для всей системы) мьютексы. См. http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx для получения дополнительной информации. Ищите глобальные и локальные.

person Patrick    schedule 17.02.2010

Идентификатор оболочки, который вы хотите использовать, — это имя пользователя. Это доступно как Environment::UserName или GetUserName().

person Byron Whitlock    schedule 17.02.2010

Вы можете перейти от идентификатора текущего процесса к идентификатору сеанса WTS, я думаю, это сделает то, что вам нужно. ProcessIdToSessionId

Вы должны знать, что сеанс служб терминалов может быть отключен от одного рабочего стола, а затем подключен к другому, поэтому «оболочка» может фактически измениться, но идентификатор сеанса должен оставаться прежним.

person John Knoeller    schedule 17.02.2010

Если вы хотите ограничить его одним экземпляром на сеанс входа в систему, даже если одна и та же учетная запись пользователя имеет несколько сеансов входа в систему одновременно (сервер/терминальный сервер), вы можете использовать дескриптор из GetShellWindow, чтобы проверить, есть ли уже запущенный экземпляр для этого рабочего стола.

person x4u    schedule 17.02.2010