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

相关文章

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

jvm调优常用命令行工具详解

《jvm调优常用命令行工具详解》:本文主要介绍jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一 jinfo命令查看参数1.1 查看jvm参数二 jstack命令2.1 查看现场堆栈信息三 jstat 实时查看堆内存,gc情况3.1

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图