6

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

3 ответа3

4

Согласно предложению Гравити, не используйте пакетный файл, который я поместил в конце этого ответа. Это связано с тем, что 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.

3

Шаг 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

Создать задачу - новое действие

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

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

1

Вы можете написать программу, используя WTSRegisterSessionNotification() для ожидания событий WTS_SESSION_LOCK и выполнения необходимых действий .

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