powershell 注册全局热键——提升效率小工具

news2025/1/4 16:32:55

powershell 注册全局热键

01 前言

在处理一些重复工作问题的时候,想搞一个小工具,配合全局快捷键来提高效率。因为是Windows系统,想到C#,但是又不想用VS开发,因为那样不够灵活,没办法随时修改随时用,所以只能另寻他法。那么,不如用powershell来搞搞。

02 正文

因为涉及到全局热键,所以还是需要写一点C#,引入一些API,同时加了一个简单的窗体。

环境:Windows 11

代码如下:


<#
注册全局热键

by hokis

2024-04-30 21:35

#>

$code = @'
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class GlobalHotkey
{
    public const int MOD_ALT = 0x0001;    // Alt键
    public const int MOD_CTRL = 0x0002;   // Ctrl键
    public const int MOD_SHIFT = 0x0004;  // Shift键
    public const int MOD_WIN = 0x0008;    // Windows键
    private const int WM_HOTKEY = 0x0312;

    private Action<object, EventArgs> hotkeyAction;
    private int id;

    [DllImport("user32.dll")]
    private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, Keys vk);

    [DllImport("user32.dll")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    public GlobalHotkey(IntPtr hWnd, Keys key, int modifier, Action<object, EventArgs> action)
    {
        hotkeyAction = action;
        id = this.GetHashCode();

        RegisterHotKey(hWnd, id, modifier, key);
        Application.AddMessageFilter(new MessageFilter(this));
    }

    public void Unregister(IntPtr hWnd)
    {
        UnregisterHotKey(hWnd, id);
    }

    private class MessageFilter : IMessageFilter
    {
        private GlobalHotkey hotkey;

        public MessageFilter(GlobalHotkey hotkey)
        {
            this.hotkey = hotkey;
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == WM_HOTKEY && (int)m.WParam == hotkey.id)
            {
                hotkey.hotkeyAction(null, EventArgs.Empty);
                return true;
            }
            return false;
        }
    }

}
'@

Add-Type -TypeDefinition $code -ReferencedAssemblies 'System.Windows.Forms'

Add-Type -AssemblyName 'System.Windows.Forms'


#全局对象
[GlobalHotkey]$Global:hotkey = $null

 <#
 热键被按下,事件处理
 #>
$action = [System.Action[System.Object,System.EventArgs]]{
    param(
        $obj,
        $er
    )
    Write-Host '热键被按下了...'
    #提醒
    [System.Media.SystemSounds]::Beep.Play()
}

<#
    .Synopsis
       窗体结构
    .DESCRIPTION
       窗体结构

#>
function Get-Windows
{
    [CmdletBinding()]
    Param
    (
        # title 窗口标题
        [Parameter(Mandatory=$true,
                    ValueFromPipelineByPropertyName=$true,
                    Position=0)]
        [string]
        $title,

        [int]
        $width = 100,

        [int]
        $height = 50,
        
        # 不透明度,1为不透明,0为透明
        [double]
        $opacity = 1,

        [System.Action[System.Object,System.EventArgs]]
        $hotkeyAction,

        #是否置顶
        [switch]
        $toTop
    )
    
    Begin
    {
    }
    Process
    {

        #主窗体
        [System.Windows.Forms.Application]::EnableVisualStyles()
	    [System.Windows.Forms.Form]$mainForm = New-Object 'System.Windows.Forms.Form'

        #控件
        [System.Windows.Forms.Button]$sureBtn = New-Object 'System.Windows.Forms.Button'
        [System.Windows.Forms.Button]$cancelBtn = New-Object 'System.Windows.Forms.Button'

	    #大小
        $mainForm.ClientSize=('{0},{1}' -f $width,$height)
        
        #最大化按钮
	    $mainForm.MaximizeBox = $False
        #最小化按钮
        $mainForm.MinimizeBox = $False
        #名称
	    $mainForm.Name = "mainForm"
        #显示icon
	    $mainForm.ShowIcon = $False
        #透明度
        $mainForm.Opacity = $opacity

        #标题
	    $mainForm.Text = $title
        #是否置顶
	    $mainForm.TopMost = $toTop
        #不可调整大小
        $mainForm.FormBorderStyle=[System.Windows.Forms.BorderStyle]::FixedSingle
        #显示位置,屏幕居中
        $mainForm.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
        
        #加入控件
        $mainForm.Controls.Add($sureBtn)
        $mainForm.Controls.Add($cancelBtn)

       
        #确定按钮
        $sureBtn.Text = '确定'
        $sureBtn.Size = '40, 30'
        $sureBtn.Location = '5, 5'
        $sureBtn.add_Click({
            #确定按钮事件
            if($Global:hotkey -and $sureBtn.Enabled){
                $sureBtn.Enabled = $False
                Write-Host '热键已注册~'
                return
            }
            
            #创建热键 F10
            #$Global:hotkey = [GlobalHotkey]::new($mainForm.Handle,[System.Windows.Forms.Keys]::F10,0,$hotkeyAction)
            
            #创建热键 Ctrl+F10
            #$Global:hotkey = [GlobalHotkey]::new($mainForm.Handle,[System.Windows.Forms.Keys]::F10,[GlobalHotkey]::MOD_CTRL,$hotkeyAction)
            
            #创建热键 Alt+F10
            #$Global:hotkey = [GlobalHotkey]::new($mainForm.Handle,[System.Windows.Forms.Keys]::F10,[GlobalHotkey]::MOD_ALT,$hotkeyAction)
            
            #创建热键 Ctrl+Alt+F10
            $Global:hotkey = [GlobalHotkey]::new($mainForm.Handle,[System.Windows.Forms.Keys]::F10,[GlobalHotkey]::MOD_CTRL + [GlobalHotkey]::MOD_ALT ,$hotkeyAction)

            $sureBtn.Enabled = $False
            Write-Host '注册成功!'
        })

        $cancelBtn.Text = '取消'
        $cancelBtn.Size = '40, 30'
        $cancelBtn.Location = '60, 5'
        $cancelBtn.add_Click({
            #取消按钮事件
            if($Global:hotkey){
                $Global:hotkey.Unregister($mainForm.Handle)
                $sureBtn.Enabled = $true
                Write-Host '已取消热键..'
            }
            $Global:hotkey = $null
        })

        $mainForm.add_FormClosed({
            #窗体关闭事件
            if($Global:hotkey){
                $Global:hotkey.Unregister($mainForm.Handle)
                $Global:hotkey = $null
            }
        })

        #显示窗口
        [void]$mainForm.ShowDialog()   
        $mainForm = $null
    }
    End
    {
    }
}

#标题
#Get-Windows -title '全局热键' -hotkeyAction $action

#置顶
#Get-Windows -title '全局热键' -hotkeyAction $action -toTop

#透明度
#Get-Windows -title '全局热键' -hotkeyAction $action -opacity 0.5

Get-Windows -title '全局热键' -hotkeyAction $action -opacity 1 -toTop

脚本使用说明

  • powershell 5.1下测试通过
  • 代码另存为 run.ps1,右键,“使用 PowerShell 运行”。弹出界面后,点“确定”按钮注册全局热键,点“取消”可以取消热键。
  • 如果不能执行脚本,提示“无法加载文件 C:\XXX\run.ps1,因为在此系统上禁止运行脚本……”。请先修改powershell执行策略(参考此处)

修改说明

  • 本例中注册的全局热键为:Ctrl+Alt+F10,如需修改,请修改$sureBtn.add_Click({...})中的部分内容。
  • 窗体的样式可以在最后部分调整
  • 热键被按下的事件处理,在
    $action = [System.Action[System.Object,System.EventArgs]]{
    param(
    $obj,
    $er
    )
    # 热键被按下时,事件处理
    Write-Host ‘热键被按下了…’
    #声音提醒
    [System.Media.SystemSounds]::Beep.Play()
    }
    中修改。
  • 窗体还可以增加输入框等控件,以适应不同的场景,有条件可以自行扩展。

效果图

  1. 运行界面:
    运行

  2. 点“确定”注册热键
    注册热键

  3. 按下热键
    按下热键

  4. 取消热键
    取消热键

03 后记

搞完这个,马上做事效率就高了。不说了,继续打工了。

欢迎留言交流~
------END------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建 WebRTC 一对一信令服务器

构建 WebRTC 一对一信令服务器 构建 WebRTC 一对一信令服务器前言为什么选择 Nodejs&#xff1f;Nodejs 的基本原理浏览器使用 Nodejs安装 Nodejs 和 NPMsocket.io信令服务器搭建信令服务器客户端服务端启动服务器并测试 总结参考 构建 WebRTC 一对一信令服务器 前言 我们在学…

一文读懂三维点云分割

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 什么是点云分割&#xff1f; 点云是世界的一种非结构化三维数据表示&#xff0c;通常由激光雷达传感器、立体相机或深度传感器采集。它由一系列单个点组成&#xff0c;每个点由 x、y 和 z 坐标定义。 自动驾驶模型的点云…

达梦数据库导入数据问题

进行数据导入的时候遇到了导入数据问题 第一个问题&#xff1a; 该工具不能解析此文件&#xff0c;请使用更高版本的工具 这个是因为版本有点低&#xff0c;需要下载最新的达梦数据库 第二个问题&#xff1a; &#xff08;1&#xff09;本地编码&#xff1a;PG_GBK, 导入文…

【JavaEE 初阶(三)】多线程代码案例

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.单例模式2.1饿汉方式2.2饿汉方式 3.阻塞队列3.1概念3.2实现 4.定时器4.1概念4.…

js原生写一个小小轮播案例

先上示例&#xff1a; 附上代码 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content…

西奥CHT-01软胶囊硬度测试仪:重塑行业标杆,引领硬度测试新纪元

西奥CHT-01软胶囊硬度测试仪&#xff1a;重塑行业标杆&#xff0c;引领硬度测试新纪元 在当今医药领域&#xff0c;软胶囊作为一种广泛应用的药品剂型&#xff0c;其品质的稳定性和安全性直接关系到患者的健康。而在确保软胶囊品质的各项指标中&#xff0c;硬度测试尤为关键。…

Bookends for Mac v15.0.2 文献书籍下载管理

Bookends Mac版可以轻松地将其导入参考 &#xff0c;并直接搜索和进口从数以百计的线上资料来源。Bookends Mac版使用内置在浏览器中下载参考与PDF格式的文件&#xff0c;或和/或网页的点击。 Bookends for Mac v15.0.2注册激活版下载 本文由 mdnice 多平台发布

云密码机的定义与特点

云密码机&#xff0c;作为云计算环境中保障数据安全的关键设备&#xff0c;其重要性不言而喻。它基于虚拟化技术&#xff0c;通过提供高性能的数据加解密、密钥管理等服务&#xff0c;确保云上数据的安全与隐私。下面&#xff0c;安策科技将从云密码机的定义、特点、应用场景以…

JAVA中的线程、死锁、异常

线程 Thread 一、程序 1&#xff0e;一段静态代码&#xff08;静态&#xff09; 二、进程 1&#xff0e;动态的&#xff0c;有开始&#xff0c;有结束&#xff1b;2&#xff0e;程序的一次执行过程&#xff0c;3&#xff0e;操作系统调度分配资源的最小单位&#xff1b; 三、…

图形渲染在AI去衣技术中的奇妙之旅

在这个数字化飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为了我们生活中不可或缺的一部分。它像一位神秘的魔法师&#xff0c;以其不可思议的力量改变着我们的世界。今天&#xff0c;我要和大家探讨的&#xff0c;是一个颇具争议却技术含金量极高的话…

群晖上部署农场管理系统farmOS

什么是 farmOS &#xff1f; farmOS 是一个基于 Web 的应用程序&#xff0c;用于农场管理、规划和记录保存。它由志愿者社区开发&#xff0c;旨在为农民、开发人员和研究人员提供一个标准平台。 需要注意的是&#xff0c;群晖内核版本太低会遇到下面的错误&#xff0c;这个 AH0…

2024暨南大学校赛热身赛解析

文章目录 A 突发恶疾B Uzi 的真身C 时间管理大师D 基站建设E 在仙境之外weiwandaixu 题目地址 A 突发恶疾 斐波那契数列 fn [0]*1000006fn[0],fn[1] 0,1for i in range(2,1000002):fn[i] (fn[i-1]fn[i-2])%998244353n int(input()) print(fn[n])B Uzi 的真身 分析&#xff…

SSM【Spring SpringMVC Mybatis】——Maven

目录 1、为什么使用Maven 1️⃣获取jar包 2️⃣添加jar包 3️⃣使用Maven便于解决jar包冲突及依赖问题 2、什么是Maven 3、Maven基本使用 3.1 Maven准备 3.2 Maven基本配置 3.3 Maven之Helloworld 4、Maven及Idea的相关应用 4.1 将Maven整合到IDEA中 4.2 在IDEA中新建…

使用脚本一键部署项目的示例(脚本会创建syetemctl的系统服务)

文章目录 说明使用脚本一键部署本项目开启/停止服务开启/关闭开机自动运行更新项目 参考地址&#xff1a;https://github.com/Evil0ctal/Douyin_TikTok_Download_API?tabreadme-ov-file 说明 后续相关项目可以使用这种方式创建脚本&#xff0c;脚本均放置在项目根目录下的bas…

【C++干货基地】揭秘C++STL库的魅力:stiring的初步了解和使用

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

AI大模型探索之路-训练篇17:大语言模型预训练-微调技术之QLoRA

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示&#xff08;题目经验&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;LCR 166.珠宝的最高价值 算法原理 1.状态表示&#xff08;题目经验&#xff09; 对于这种路径类的问题&…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

在做题中学习(52): 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;O(logn)的时间复杂度&#xff0c;很可能是二分法&#xff0c;再看看有没有二段性&#xff1a; 由题目可以知道&#xff0c;i的左边比i小&#xff0c;右边比i大&am…

47.Redis学习笔记

小林coding -> 图解redis的学习笔记 文章目录 Rediswindwos安装docker安装redis启动redis使用RDM访问虚拟机中的redispython连接redis缓存穿透、击穿、雪崩基本数据类型高级数据类型高并发指标布隆过滤器分布式锁Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡…