ThinkPad T430沒有關閉屏幕的功能鍵,不太方便,正好最近在折騰PowerShell,便寫個腳原本實現這個功能。php
爲了更方便的使用腳本,須要用到3.0版的模塊自動裝載功能,安裝和配置方法見:http://home4j.duapp.com/index.php/2013/12/27/windows-powershell-3.html。html
Windows提供的兩個相關API都在User32.dll中,分別是:git
PostMessage函數,用於關閉屏幕,http://msdn.microsoft.com/en-us/library/windows/desktop/ms644944.aspx;shell
LockWorkStation函數,用於鎖屏,http://msdn.microsoft.com/en-us/library/windows/desktop/aa376875.aspx。windows
PowerShell的強大之處在於可以嵌入編寫C#、VB等代碼,能夠直接調用Windows的API,已經無所不能了,示例:http://gallery.technet.microsoft.com/scriptcenter/Demo-of-calling-C-and-6ef0cd2b。app
# sys.psm1,PowerShell模塊代碼 # 當即關閉屏幕 function turnOffMonitor { # 檢查新定義的類是否已經加載,避免重複 if (-not ("me.joshua.powershell.MonitorUtil" -as [type])) { # C#代碼 $Source = @" // 引入Dll及相關的函數 [DllImport("user32.dll")] public static extern int PostMessage(int hWnd, int Msg, int wParam, int lParam); public static void TurnOffMonitor() { // 「SendMessage」會有被阻塞沒法返回的狀況,因此使用「PostMessage」 PostMessage(0xffff, 0x0112, 0xF170, 2); } "@ // 加載新定義的類型,指定類名和Namespace Add-Type -MemberDefinition $Source -name "MonitorUtil" -namespace "me.joshua.powershell" } // 調用函數關閉屏幕 [me.joshua.powershell.MonitorUtil]::TurnOffMonitor() } # 鎖屏 function lock { # 「LockWorkStation」沒入參,能夠直接使用rundll32.exe調用,「PostMessage」則由於須要轉化參數類型而不行 rundll32.exe user32.dll,LockWorkStation # 2秒後關閉屏幕 sleep -Seconds 2 turnOffMonitor } # 把模塊中的函數導出,以便直接在PowerShell中使用 Export-ModuleMember -Function turnOffMonitor Export-ModuleMember -Function lock
以上代碼是PowerShell的模塊代碼,在3.0以前的版本須要用命令Import-Module 加載,3.0的自動裝載配置可參見本文1.1節。加載後可直接經過命令turnOffMonitor 和lock 關閉或鎖定屏幕。 腳本Git地址:http://git.oschina.net/joshuazhan/demo4j/blob/master/script/powershell/modules/sys.psm1 函數
PowerShell支持經過命令來解析執行語句,如:PowerShell.exe -Command "turnOffMonitor" ,這意味着能夠經過快捷方式來執行命令,不須要每次都打開PowerShell來數據。spa
建立步驟:一、在目錄或桌面上,右鍵 -> 新建 -> 快捷方式;二、在位置中填入路徑及執行參數 "%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe " -Command "turnOffMonitor" (不一樣系統路徑可能不一樣)。.net
附:原始Blog地址http://home4j.duapp.com/index.php/2014/01/04/use-powershell-to-turn-off-monitor-and-lock-screen.htmlcode