Есть ли способ автоматического выхода из программы в Windows 7 всякий раз, когда я блокирую экран?
3 ответа
Согласно предложению Гравити, не используйте пакетный файл, который я поместил в конце этого ответа. Это связано с тем, что rundll32.exe
не соответствует соглашению о вызовах функции Win32 API LockWorkStation
(подробности см. В этой записи блога MSDN ). При этом существует лучшая альтернатива, которая не требует слишком много работы.
Вы можете использовать язык сценариев AutoIt и функцию DllCall
для вызова функции Win32 API без повреждения стека вызовов. Вы также можете использовать ProcessClose
вместо TASKKILL
. Для справки, вот ссылка на LockWorkStation
из MSDN.
Поместите следующие две строки в файл и сохраните его как exitandlock.au3
(или что-то подобное). Затем вы можете запустить его с AutoIt (или даже скомпилировать его в .exe, если хотите).
ProcessClose("yourapp.exe")
DllCall("user32.dll", "BOOL", "LockWorkStation")
Это должно предоставить вам то, что вы хотите, без повреждения стека вызовов. Затем вы можете привязать этот файл к горячей клавише и использовать его для блокировки вашей рабочей станции. Кроме того, вы можете скомпилировать его в файл .exe и настроить для запуска в качестве запланированной задачи после того, как ваш компьютер неактивен.
Наконец, вы также можете использовать функцию WinClose
в качестве альтернативы ProcessClose
.
Как я уже сказал, пожалуйста , не используйте этот метод. Я держу это здесь только для полноты, поскольку это один из наиболее широко используемых способов в Интернете. Вы можете использовать простой пакетный файл, чтобы сделать это, используя команду TASKKILL
:
@ECHO OFF
TASKKILL /IM yourapp.exe
Rundll32.exe User32.dll,LockWorkStation
Затем просто запустите пакетный файл, если вы хотите заблокировать свою рабочую станцию. Кроме того, вы также можете назначить горячую клавишу для запуска пакетного файла, а затем просто нажать эту комбинацию клавиш, когда вы хотите заблокировать ее. Для получения дополнительной информации о команде TASKKILL
см. Эту статью от Microsoft.
Шаг 1: Напишите скрипт, который прекратит работу программы
Создайте файл с именем terminate.vbs
со следующим содержимым:
set objwmiservice = getobject("winmgmts:\\.\root\cimv2")
strprocessname = wscript.arguments.item(0)
strquery = "select * from win32_process where name='" & strprocessname & "'"
set colitems = objwmiservice.execquery(strquery,,48)
for each objitem in colitems
objitem.terminate
next
Протестируйте этот сценарий, открыв командную строку и выполнив cscript.exe "C:\path\to\terminate.vbs" notepad.exe
. Замените notepad.exe
именем процесса, который вы хотите прервать.
Шаг 2. Запланируйте запуск сценария при блокировке экрана.
Откройте планировщик задач (вы можете найти его в меню «Пуск»), щелкните правой кнопкой мыши библиотеку планировщика задач и выберите « Создать задачу ...». На вкладке Общие укажите название и описание вашей задачи. Вы можете изменить Конфигурировать для: на Windows 7, Windows Server 2008 R2, если хотите, но это не обязательно.
На вкладке « Триггеры » создайте новый триггер и установите для параметра « Начать задачу» значение « Блокировка рабочей станции». Остальные настройки по умолчанию в порядке.
На вкладке Действия создайте новое действие, которое запустит программу. Программа / скрипт: должен быть cscript.exe. Введите путь к terminate.vbs
и имя процесса, который вы хотите завершить, в поле Добавить аргументы (необязательно): Мои аргументы:"C:\Users\Public\Documents\terminate.vbs" notepad.exe
Вы можете проверить вкладки Условия и настройки для получения дополнительных опций, но ни один из них здесь не требуется. Сохраните задачу, и все готово. Когда вы заблокируете экран, процесс должен прекратиться.
Обратите внимание, что если вы заблокируете экран, а затем быстро разблокируетесь, вы можете увидеть окно командной строки или процесс, который вы хотите завершить, все еще находится в процессе завершения. Это зависит от того, сколько времени потребуется, чтобы завершить процесс изящно.
Вы можете написать программу, используя WTSRegisterSessionNotification()
для ожидания событий WTS_SESSION_LOCK
и выполнения необходимых действий .