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…

Qt5配置Opencv读取一张图像

1、首先Qt5配置Opencv(我已经配置成功)有时间发出来 2、Opencv的基本Mat操作 &#xff08;1&#xff09;加Opencv的头文件 #include<opencv2/opencv.hpp> #include <opencv2/highgui/highgui_c.h> using namespace cv;&#xff08;2&#xff09;Opencv图像基本处理…

idea git commit全局ignore配置

idea 全局ignore配置 在开发时&#xff0c;提交开发代码到git&#xff0c;需要剔除一些不需要提交的文件。那么可以配置一个全局ignore文件。 配置方法 新建一个git.ignore文件&#xff0c;将配置写好。 # DIY target/# svn .svn/ # Linux System *~# KDE directory prefer…

自动驾驶框架 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…

移动端适配方案

移动端适配 方案 1&#xff1a;rem html font-size 方案 2&#xff1a;vw rem html font-size rem 是相对于 html 元素的 font-size 来设置的单位&#xff0c;通过在不同屏幕尺寸下动态修改 html 元素的 font-size 可达到适配效果 在开发中&#xff0c;我们只需要考虑两个…

IDEA->EasyCode(mapper.xml) 字段无逗号分割问题

IDEA-&#xff1e;EasyCode(mapper.xml) 字段无逗号分割问题_easycode allsqlcolumn 没有逗号-CSDN博客 在easycode的设置里找到&#xff1a; 1、Template下的 mapper.xml.vm脚本 2、Global Config下的 mybatisSupport.vm脚本 然后将这两个脚本里的 $velocityHasNext 替换成 …

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…