惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
量子位
月光博客
月光博客
人人都是产品经理
人人都是产品经理
U
Unit 42
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
H
Help Net Security
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
MyScale Blog
MyScale Blog
美团技术团队
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
D
Docker
B
Blog
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog

VnYzm的博客

游戏玩后感:ReLief:献给亲爱的你 我的周边(谷子)分享 游戏玩后感:Kanon 简谱:致真实的你 《Rust中常见的有关生命周期的误解》学习笔记 简谱:StarMap 简谱:かく咲きたらばいと恋ひめやも 简谱:东风 简谱:无法诉说的思念 简谱:Girlish 游戏玩后感:时钟机关的Layline 简谱:风之琶音 简谱:星空的记忆 简谱:因为遇见了你 简谱:月童 番茄简谱脚本转调器 游戏玩后感:青空下的约定:Refine 游戏玩后感:在这苍穹展翅 书籍读后感:控制论与科学方法论 游戏玩后感:恋爱表达式 游戏玩后感:樱之诗 MLIR-tutorial学习笔记 游戏玩后感:潜伏之赤途 游戏玩后感:纯爱咖啡厅:帕露菲重制版 游戏玩后感:智以泪聚 游戏玩后感:初雪樱 游戏玩后感:告别回忆:从今以后 游戏玩后感:梦灯花 游戏玩后感:金辉恋曲四重奏 游戏玩后感:五彩斑斓的世界
PowerShell创建参考窗口
VnYzm · 2020-04-30 · via VnYzm的博客

背景

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

思路

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

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

  • 添加命名空间

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

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

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

  • 窗口置顶

    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(); # 显示窗口
}

附:一些PowerShell命令

powershell下转进制

十进制转二进制

[Convert]::ToString(100, 2)

二进制转十进制

[Convert]::ToInt32('100', 2)

powershell下将文件放到剪贴板

Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.Clipboard]::SetFileDropList('E:\1.txt');

注意文件路径必须是绝对路径

批量用ffmpeg将wav文件转码成mp3文件,文件名前缀不变

foreach ($i in ls *.wav) { ffmpeg -i $i.name -acodec mp3 $i.name.replace('wav', 'mp3') }

批量将z开头的文件名中的z去掉

foreach ($i in ls z*) { mv $i.name $i.name.substring(1) }

powershell下查找文件内容包含字符串txt的文件

powershell下查找扩展名为txt的文件