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------

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

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

相关文章

Windows系统下安装Mosquitto的步骤(2)

接前一篇文章&#xff1a;Windows系统下安装Mosquitto的步骤&#xff08;1&#xff09; 本文内容参考&#xff1a; Windows10上安装Mosquitto的步骤(win10、win11 安装mqtt) - IPS99技术分享 MQTT&#xff1a;windows环境下配置MQTT服务器&#xff08;mosquitto&#xff09;_…

2024.阳光能源追光计划暨大陆考察团交流分享会

近日大陆考察团抵达香港&#xff0c;受到了本司热情接待和安排。公司于4月27日下午举办了阳光能源追光计划主题交流会。 会上公司营销部总监张超&#xff0c;分享了阳光能源近几年的能源发展之路及公司新推出的追光计划&#xff0c;得到了大陆考察交流团团长杨国均先生的高度赞…

Vue.js课后练习(登录注册和大小比较)

第一题 请编写登录页面和注册页面&#xff0c;通过动态组件实现动态切换页面中显示的组件&#xff0c;效果如图1和图2所示。 图1 登录页面 图2 注册页面 代码&#xff1a; my.vue代码: <template>登录 </template><script setup> </script><st…

【Go 语言入门专栏】Go 语言的起源与发展

前言 Go 语言是当下最为流行的编程语言之一&#xff0c;大约在 2020、2021 年左右开始于国内盛行&#xff0c;许多大厂很早就将部分 Java 项目迁移到了 Go&#xff0c;足可看出其在性能方面的优越性。 相信各位都知道&#xff0c;在爬虫业务中&#xff0c;并发是一个关键的需…

Notes for the missing semester. Useful and basic knowledge about Linux.

The Shell Contents The first course is to introduce some simple commands. I’ll list some commands that I’m not familiar with: # --silent means dont give log info, # --head means we only want the http head. curl --head --silent bing.com.cn# cut --deli…

【再探】设计模式—抽象工厂及建造者模式

抽象工厂模式和建造者模式都属于创建型模式。两者都能创建对应的对象&#xff0c;而创建者模式更侧重于创建复杂对象&#xff0c;将对象的创建过程封装起来&#xff0c;让客户端不需要知道对象的内部细节。 1 抽象工厂模式 需求&#xff1a; 在使用工厂方法模式时&#xff0…

Java File类

1. File类概述 1.1 什么是File类 File是java.io包下作为文件和目录的类。File类定义了一些与平台无关的方法来操作文件&#xff0c;通过调用File类中的方法可以得到文件和目录的描述信息&#xff0c;包括名称、所在路径、读写性和长度等&#xff0c;还可以对文件和目录进行新建…

从Paint 3D入门glTF

Paint 3D Microsoft Paint 3D是微软的一款图像编辑软件&#xff0c;它是传统的Microsoft Paint程序的升级版。 这个新版本的Paint专注于三维设计和创作&#xff0c;使用户可以使用简单的工具创建和编辑三维模型。 Microsoft Paint 3D具有直观的界面和易于使用的工具&#xff0…

GitLab常用指令!(工作中常用的)

目录 克隆代码创建分支切换分支将代码提交到分支当中Merge合并 克隆代码 复制完地址&#xff0c;打开Git Bash&#xff0c;然后 git clone “复制的地址”创建分支 创建new_test分支 git branch new_test切换分支 切换到new_test分支 git checkout new_test将代码提交到分…

Hotcoin Research | 市场洞察:2024年4月22日-28日

加密货币市场表现 本周内加密大盘整体呈现出复苏状态&#xff0c;在BTC减半后进入到震荡上行周期。BTC在$62000-66000徘徊&#xff0c;ETH在$3100-3300徘徊&#xff0c;随着港交所将于 4 月 30 日开始交易嘉实基金的比特币和以太坊现货 ETF&#xff0c;周末行情有一波小的拉升…

vue+elementUI实现点击左右箭头切换按钮功能

原本是可以用el-tabs做的,就像下面的样式,但是领导说不行 最后用button和element里面的el-carousel(走马灯)结合了一下 长这样 感觉还不错 可以自己改样式 代码如下: <div class"drawer-carousel"><el-carousel arrow"always" :loop"false…

自动驾驶框架 UniAD环境部署

感谢大佬们的开源工作 UniAD-github地址-YYDS更多bev算法部署参考如果您觉得本帖对您有帮助&#xff0c;感谢您一键三连支持一波^_^ 统一自动驾驶框架 (UniAD) &#xff0c;第一个将全栈驾驶任务整合到一个深度神经网络中的框架&#xff0c;并可以发挥每个子任务以及各个模块的…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

开通Jetbrains个人账号,赠送这些付费插件

开通Jetbrains个人账号&#xff0c;或者Jetbrains现成账号的, 可赠送以下付费插件 现成账号&#xff1a;https://web.52shizhan.cn/activity/xqt8ly 个人账号&#xff1a;https://web.52shizhan.cn/legal 账号支持全家桶系列&#xff1a;AppCode,CLion,DataGrip,GoLand,Intell…

WebAuthn 无密码身份认证

文章目录 WebAuthn简介工作原理组成部分架构实现注册认证应用场景案例演示 WebAuthn简介 WebAuthn&#xff0c;全称 Web Authentication&#xff0c;是由 FIDO 联盟&#xff08;Fast IDentity Online Alliance&#xff09;和 W3C&#xff08;World Wide Web Consortium&#x…

java技术栈快速复习05_基础运维(linux,git)

Linux知识总览 linux可以简单的理解成和window一样的操作系统。 Linux和Windows区别 Linux是严格区分大小写的&#xff1b;Linux中一切皆是文件&#xff1b;Linux中文件是没有后缀的&#xff0c;但是他有一些约定俗成的后缀&#xff1b;Windows下的软件一般是无法直接运行的Li…

如何安全可控的进行跨区域数据交换,提高数据价值?

跨区域数据交换指的是在不同地理位置或不同网络环境下的数据传输和共享。随着数字化转型的加速&#xff0c;企业及组织越来越依赖于数据的流动来优化业务流程、增强决策制定和推动创新。然而&#xff0c;跨区域数据交换也带来了一系列的挑战和风险&#xff0c;主要包括&#xf…

3款超好用的PDF在线处理神器,学会了职场工作效率翻倍!

&#x1f60a; 作为一名职场小白,我深知处理文档的痛苦。尤其是面对PDF这个"大魔王",经常感到头大! 合同要合并、简历要压缩、论文要转Word改格式…一个个来手动操作,简直要累死。&#x1f62b; 直到我发现了这些PDF在线处理神器!瞬间感觉自己的工作效率嗖嗖提升,整…

【STM32】F405/407的模块总览图,记录查看

从STM32F405/407数据手册中提取&#xff0c;方便以后查看。主要是什么外设连接在什么总线上&#xff0c;时钟频率是多少。 TIM2、3、4、5、12、13、14在APB1上&#xff0c;最大频率84M TIM1、8、9、10、11在APB2上&#xff0c;最大频率168M

3.9设计模式——Strategy 策略模式(行为型)

意图 定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化 结构 Strategy&#xff08;策略&#xff09;定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方…