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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值