1. 程式人生 > >powershell 呼叫API顯示或隱藏指定程式的主視窗

powershell 呼叫API顯示或隱藏指定程式的主視窗

powershell 呼叫API顯示或隱藏指定程式的主視窗

001. 前言

一同事碰上這種情況:某個單例項的程式不知為何掛在後臺執行,托盤中也找不到圖示(一般是有的),但可以在工作管理員中看到該程式處於執行狀態。問我:能不能讓這程式的介面顯示出來呢?二話不說立馬開始折騰(沒錯是個妹子 ╯▽╰ )。
嗯,肯定有人想說:這不很簡單,直接kill了重新執行~ 。但是,有些情況就是不能kill,所以只好試試API了。

002. 正文

下面開始程式碼:

<#
   .NOTES
    ===========================================================================
     Created with
: SAPIEN Technologies, Inc., PowerShell Studio 2014 v4.1.58 Created on: 2017/12/29 Created by: hokis =========================================================================== .DESCRIPTION 1、用於顯示或隱藏指定程式主視窗 2、FindWindow 函式,獲取指定視窗控制代碼。第一引數為視窗的類名(可為空),第二引數為視窗標題文字 3
、ShowWindow 函式,設定指定視窗的顯示狀態。第一引數為指定視窗的控制代碼,第二引數即為需要設定的狀態(部分常用值:0-隱藏,1-正常顯示,2-最小化,3-最大化,9-還原) #> $code = @' [DllImport("user32.dll", EntryPoint = "FindWindow")] public extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto
)] public extern static bool ShowWindow(IntPtr hwnd, uint nCmdShow); '@ #引入API $myAPI = Add-Type -MemberDefinition $code -Name myAPI -PassThru #測試CMD視窗(需先執行一個CMD視窗) $cmdWin = @("ConsoleWindowClass", "管理員: 命令提示符") #顯示(1或9)或隱藏(0) $myapi::ShowWindow($myAPI::FindWindow($cmdWin[0], $cmdWin[1]), 9) | Out-Null

10行搞定,嗯,還是不錯的。

當然,這個指令碼有一些限制
1. 至少需要知道視窗的標題文字。視窗的類名可以通過專業工具(如:spy++)得到。
2. 未考慮多個視窗同一個標題的情況,如果有此情況,請慎用。

003. 後記

這個版本其實受到啟發才得以精簡成10行,一開始的版本是寫得比較複雜(還定義了C#類、靜態方法等一堆)。

-END-

參考:PowerShell 技能連載 - 顯示或隱藏視窗 | 歎為觀止