powershell 调用API显示或隐藏指定程序的主窗口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HoKis/article/details/78927662

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 技能连载 - 显示或隐藏窗口 | 叹为观止

猜你喜欢

转载自blog.csdn.net/HoKis/article/details/78927662