powershell 呼叫API顯示或隱藏指定程式的主視窗
阿新 • • 發佈:2018-11-21
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-