5

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

2 ответа2

5

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

  • создайте "фальшивый установщик", который сам по себе является лишь маленькой оберткой вокруг приложения, которое вы хотите запустить
  • сделать этот установщик простым, см. здесь http://nsis.sourceforge.net/Allow_only_one_installer_instance или http://nsis.sourceforge.net/Check_whether_your_application_is_running
  • запустите ваше приложение из этого "установщика оболочки", смотрите здесь http://nsis.sourceforge.net/ExecCmd_plug-in
  • "спрятать" обычную иконку приложения от пользователя и представить этот фальшивый установщик. поскольку вы можете добавить к нему красивый значок, вы должны сделать его похожим на оригинальную программу.
2

Если нет обходного пути, который вы можете применить с помощью Application Compatibility Kit, который позволяет это - что я сомневаюсь (это не та вещь, которая сама по себе нарушает совместимость 1) - тогда в Windows нет настроек.

Помимо приложения запуска, другой подход будет заключаться в мониторинге новых процессов (например, События создания экземпляра WMI для объектов Win32_Process отфильтрованные по сеансу) и выполнение некоторых действий для блокировки второго экземпляра.


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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .