PowerShell创建参考窗口

背景

平常我们经常遇到这样一个问题,在使用一个窗口工作时常常需要参考其他窗口的文字或图片,此时就需要频繁切换窗口;或者是看视频时需要参考前面进度的画面;或者是阅读或写文档时需要参考其他位置的文字,这时就希望能有一个始终置顶的窗口,实时显示文字或图片方便参考。

思路

因为文字可以通过截图转化为图片,所以只需考虑图片的显示。这个程序的功能和截图联系非常紧密,可以利用QQ截图的功能,我们的程序只需从剪贴板中读取图片就行。此外,我们希望窗口能始终置顶,这样才能方便参考。为了方便,我使用了PowerShell,通过调用.Net的窗口创建和读取剪贴板功能,可以很容易地实现这一功能。

PowerShell调用.Net里的功能,和C#有以下几点不同:

  • 添加命名空间

    Add-Type -AssemblyName System.Windows.Forms;
    
  • 实例化类

    $form = [Windows.Forms.Form]::new();
    

    类似与静态方法的调用和,用[类名]::new() 创建,同时这个类名可以省略最前面的System.

  • 窗口置顶

    $form.TopMost = $true;
    

    PowerShell里的布尔值前面需要加$

  • 添加点击事件

    $click = {
    	...
    }
    $form.add_Click($click);
    Invoke-Command $click;
    

    PowerShell在给WinForm添加事件时,不像C#通过事件和委托机制实现,而是另外定义了像add_Click 这样的方法,将代码块赋给变量,然后将变量传给add_Click 即可添加点击事件。代码块本身也可以通过Invoke-Command 命令实现。

  • 隐藏命令行窗口

    powershell -windowstyle hidden {
    	...
    }
    

    在所有的代码外套上这一层隐藏命令行的设置,即可实现此功能。

代码

powershell -windowstyle hidden { # 隐藏命令行
    Add-Type -AssemblyName System.Windows.Forms; # 添加命名空间
    $form = [Windows.Forms.Form]::new();
    $form.BackgroundImageLayout = 3; # 使图片跟随窗口大小缩放
    $form.TopMost = $true; # 窗口置顶
    $form.MaximizeBox = $false; # 屏蔽最大化按钮
    $click = {
        $data = [Windows.Forms.Clipboard]::GetDataObject(); # 获得剪贴板数据
        if ($data.GetDataPresent([Windows.Forms.DataFormats]::Bitmap)) {
            $img = $data.GetData([Windows.Forms.DataFormats]::Bitmap); # 将数据转换成图片
            $form.BackgroundImage = $img; # 把图片设为窗口背景
            $form.ClientSize = $img.Size; # 把窗口图片区域的大小设为和图片一样
        }
    }
    $form.add_Click($click); # 添加点击事件
    Invoke-Command $click; # 先执行一次,把当前图片放进窗口
    $form.ShowDialog(); # 显示窗口
}
posted @ 2020-06-09 10:13  YuanZiming  阅读(986)  评论(0编辑  收藏  举报