有没有办法在我锁定屏幕时自动退出 Windows 7 上的程序?
答案1
根据 Grawity 的建议,不要使用我放的批处理文件在本答案的最后。这是因为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
,请参阅这篇文章来自微软。
答案2
步骤 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如果你愿意的话,但那不是必需的。
在触发器选项卡,创建新触发器并设置开始任务:到工作站锁定. 其余默认设置即可。
在操作选项卡,创建一个新的操作,启动程序。程序/脚本:应该脚本文件terminate.vbs
.在添加参数(可选):框。我的论点是"C:\Users\Public\Documents\terminate.vbs" notepad.exe
您可以检查状况和设置选项卡以获得更多选项,但这些选项在这里都不是必需的。保存任务,您就完成了。锁定屏幕后,该过程应终止。
请注意,如果您锁定屏幕然后快速解锁,您可能会看到命令提示符窗口或您想要终止的进程仍在终止过程中。这取决于进程正常终止所需的时间。
答案3
您可以编写一个程序来WTSRegisterSessionNotification()
等待WTS_SESSION_LOCK
活动并做必要的事情。
可以在此处找到示例:https://superuser.com/a/264973/1686