有沒有辦法在 Windows 7 上鎖定螢幕時自動退出程式?
答案1
根據grarity的建議,不要使用我放置的批次文件在這個答案的最後。這是因為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