使用WinAPI全局热键注册和全局模拟按键

一、全局热键注册

1、先引用DLL

[System.Runtime.InteropServices.DllImport("user32.dll")] //导入WinAPI

public static extern bool RegisterHotKey( //设置热键

IntPtr hWnd, // 窗口句柄,一般使用Handle属性

int id, // 区别热键的ID号,这个可以随便写,只是用来区分不同热键

uint fsModifiers, // 修正键用户接下哪些键是发生 可能为contol=2, alt=1, shift=4, windows=8或这些键的组合,如果没有的话直接用0

Keys vk // 键

);

[System.Runtime.InteropServices.DllImport("user32.dll")] //导入WinAPI

public static extern bool UnregisterHotKey( //注销热键

IntPtr hWnd, // 窗口句柄

int id // 键标识

);

2、调用函数

RegisterHotKey(Handle, 200, 0, Keys.F1); // 注册热键F1

3、此事件用来响应热键

protected override void WndProc(ref Message m)//监视Windows消息

{

const int WM_HOTKEY = 0x0312; //如果m.Msg的值为0x0312那么表示用户按下了热键

switch (m.Msg)

{

case WM_HOTKEY: ProcessHotkey(m); //按下热键时调用ProcessHotkey()函数

break;

}

base.WndProc(ref m); //将系统消息传递自父类的WndProc

}

4、判断是按了哪个热键,然后执行方法

private void ProcessHotkey(Message m) //用于控制运行窗体是否开启

{

IntPtr id = m.WParam; //IntPtr用于表示指针或句柄的平台特定类型

string sid = id.ToString(); //根据注册热键时传递的ID区分按得是哪个热键

switch (sid)

{

case "200": //code。。触发之后执行的代码

break;

}

}

二、模拟按键(全局)

1、引用API

[DllImport("user32.dll", EntryPoint = "keybd_event")]

public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, UIntPtr dwExtraInfo);

参数1:键盘码,具体请到百度搜索键盘码

参数2:键盘扫描码,可以使用0

参数3:表示触发的键盘事件类型,比如key_up,key_down等,默认直接用0

参数4:没多大用,直接用UIntPtr.Zero就行

2、调用

byte VK_F11 = 122; //模拟按下F11键

keybd_event(VK_F11, 0, 0, UIntPtr.Zero);

时间: 2024-10-13 06:30:38

使用WinAPI全局热键注册和全局模拟按键的相关文章

Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)

转载:http://www.cuteqt.com/blog/?p=2088 Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是Windows篇,就说明这些代码只支持windows系统.同时,也说明肯定还有其他平台的要写.不过要等O(∩_∩)O~ 在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include <window

;徐晓亮的跟随电脑启动的AutoHotkey全局热键和热字串脚本

/*;------------------------------------------------------------[重要提示]在SciTE或者EmEditor中按热键Ctrl+G -> 150 -> Enter跳转到热键定义处①立即升级杀毒软件病毒库②用pft.exe个人文件转移工具转移文件夹到非系统盘D:盘(pft.exe文件来自于一键Ghost硬盘版C:\dosh\ghos\pft.exe)③通过Total Commander的工具栏来正确的新建和打开文件和文件夹(养成只在36

Qt全局热键(windows篇)

Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是Windows篇,就说明这些代码只支持windows系统.同时,也说明肯定还有其他平台的要写.不过要等O(∩_∩)O~ 在Qt要调用Windows的API其实很简单,只要在需要用到的头文件中添加#include <windows.h>即可.不过要注意,Qt仅支持win32的API,像MFC之类的是不

C# 全局热键设置 与 窗体热键设置

1. 窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如下: private void FrmMain_KeyDown(object sender, KeyEventArgs e) { if (e.Alt && e.Shift && e.Control && e.KeyCode == Keys.S) { MessageB

Java设置全局热键——第三方包jintellitype实现

Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实现了,发布成第三方java包,借此,我们可以很方便的设置全局热键而不用编写任何C/C++代码. jintellitype官网貌似目前访问不到,这里提供下载:http://pan.baidu.com/s/1kTIDxgN. 我实现的演示Demo源码下载:http://pan.baidu.com/s/1

Qt5全局热键-QxtGlobalShortcut

最近做一个项目需要注册全局热键,在网上搜索发现有个第三方库 libqxt 中给出一个比较好的跨平台的解决方案,就是 QxtGlobalShortcut. 但是编译过程中发现这个库用到的QAbstractEventDispatcher::EventFilter在qt5.3.1中已经没了,所以我就自己改写了一下. 更改部分如下: 在QxtGlobalShortcutPrivate类的前面添加如下代码,因为在qt5中需要用到QAbstractNativeEventFilter这个类 源文章地址http

全局热键

Demo下载:https://git.oschina.net/xieyimo9/quanjurejian.git 主要代码: procedure TForm1.HotKey(var msg: TMessage); begin if msg.WParam =FHotKeyId_Alt_Down then Memo1.Lines.Add('Alt Down') else if msg.WParam =FHotKeyId_Alt_Up then Memo1.Lines.Add('Alt Up') el

全局热键与隐藏窗口启动程序矛盾的解决记录

需要实现的需求如下: 程序启动分2种:正常带窗口(手动启动):静默不带窗口直接显示托盘(开机启动:自动更新后启动) 遇到的难点及解决: 由于程序用用到全局热键截屏(由RegisterHotKey...实现),发现最小化托盘后就有问题了.最后发现去掉"this.ShowInTaskbar=false;"就可以了.至于原因没有深究.但要是没有这句的话,开机带参数静默启动时会出现闪屏,而且更严重的是,自动更新是通过后台一个服务控制的,所以自动更新后启动前台程序需要session0穿透.通过这

Qt 5.x 全局热键 for windows

Qt 升级到5.x版本后,QAbstractEventDispatcher中函数发生变动,导致libqxt库中的qxtGlobalShortcut挂掉.参考qxtGlobalShortcut写了一个全局热键类,用法与qxtGlobalShortcut一致.在 Win8.1 + Qt 5.11 能正常使用 _______________________________________________________________________   用法 ____________________