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-