Ограничить приложение одним экземпляром для каждого сеанса командной строки в Windows
-
21-09-2019 - |
Вопрос
Существует множество решений для ограничения повторного запуска приложения.Поиск по имени процесса, использование именованного мьютекса и т.д.Но у меня все эти методы не работают, если я хочу ограничить свое приложение сеансом командной строки.
У пользователя может быть нечто большее, чем сеанс входа в систему и оболочка в Windows (верно?)?Если это верно, я хочу иметь возможность запускать один экземпляр моего приложения в каждом сеансе командной строки, но разрешать только один.
Есть ли способ получить идентификатор оболочки, который затем можно было бы вставить в имя мьютекса?
Решение
Вы можете создавать локальные (только для сеанса) или глобальные (для всей системы) мьютексы.Видишь http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx для получения дополнительной информации.Ищите глобальные и локальные.
Другие советы
Идентификатор оболочки, который вы хотите использовать, - это имя пользователя.Это доступно в виде Environment::UserName
или GetUserName()
Вы можете перейти от идентификатора процесса текущего процесса к идентификатору сеанса WTS, я думаю, это сделает то, что вам нужно. processidtosessionidпроцесссидтосессионид
Вы должны знать, что сеанс служб терминалов может быть отключен от одного рабочего стола, а затем подключен к другому, поэтому "оболочка" действительно может измениться, но идентификатор сеанса должен остаться прежним.
Если вы хотите ограничить его одним экземпляром для каждого сеанса входа, даже если одна и та же учетная запись пользователя имеет несколько сеансов входа, запущенных одновременно (Сервер / Terminal Server), вы могли бы использовать дескриптор из GetShellWindow
чтобы проверить, есть ли уже запущенный экземпляр для этого рабочего стола.