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

2024-05-01 07:44

本文主要是介绍powershell 注册全局热键——提升效率小工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

powershell 注册全局热键

01 前言

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

02 正文

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

环境:Windows 11

代码如下:


<#
注册全局热键by hokis2024-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 = $FalseWrite-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 = $FalseWrite-Host '注册成功!'})$cancelBtn.Text = '取消'$cancelBtn.Size = '40, 30'$cancelBtn.Location = '60, 5'$cancelBtn.add_Click({#取消按钮事件if($Global:hotkey){$Global:hotkey.Unregister($mainForm.Handle)$sureBtn.Enabled = $trueWrite-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.5Get-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------

这篇关于powershell 注册全局热键——提升效率小工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951100

相关文章

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

springboot日期格式化全局LocalDateTime详解

《springboot日期格式化全局LocalDateTime详解》文章主要分析了SpringBoot中ObjectMapper对象的序列化和反序列化过程,并具体探讨了日期格式化问题,通过分析Spri... 目录分析ObjectMapper与jsonSerializer结论自定义日期格式(全局)扩展利用配置

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co