C++ builder热键处理方式(HotKey)
demo1:
Hook Hotkey 系统热键
函数功能:该函数定义一个系统范围的热键。
函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);
参数说明:
hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。registerhotkey若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。
id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。
fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:
MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。
MOD_SHIFT:按下的可以是任一Shift键。
MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。
vk:定义热键的虚拟键码。
返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。
备注:当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。该消息被传送到队列头部,因此它将在下一轮消息循环中被移去。该函数不能将热键同其他线程创建的窗口关联起
来。
若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。registerhotkey
若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。
Windows CE:Windows CE 2.0以上版本对于参数fsModifiers支持一个附加的标志位。叫做MOD_KEYUP。
若设置MOD_KEYUP位,则当发生键被按下或被弹起的事件时,窗口将发送WM_HOTKEY消息。
RegisterHotKey可以被用来程之间登记热键。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。
UnregisterHotKey()
===========================
函数功能:该函数在系统中注消热键。
函数原型:BOOL UnregisterHotKey( HWND hWnd, int id);
参数:该函数的参数和 RegisiterHotKey 的那两个参数意义大体相同。
UnitFormMain.hprivate:ATOM HotKeyStart, HotKeyEnd;void __fastcall WndProc(Messages::TMessage &Message);UnitFormMain.cppvoid __fastcall TFormMain::FormCreate(TObject *Sender)
{HotKeyStart = GlobalAddAtom("HotKeyStart");HotKeyEnd = GlobalAddAtom("HotKeyEnd");// Register HotKeyRegisterHotKey(Handle, HotKeyStart, MOD_CONTROL, VK_F2);RegisterHotKey(Handle, HotKeyEnd, MOD_CONTROL, VK_F3);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::WndProc(Messages::TMessage &Message)
{if (Message.Msg == WM_HOTKEY){// LParamHi: VirtualKey// LParamLo: key-modifierif (Message.LParamHi == VK_F2)Start(); // 熱鍵 Start 處理elseif (Message.LParamHi == VK_F3)End(); // 熱鍵 End 處理}TForm::WndProc(Message);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormDestroy(TObject *Sender)
{// Unregister HotKeyif(HotKeyStart) UnregisterHotKey(Handle, HotKeyStart); GlobalDeleteAtom(HotKeyStart);if(HotKeyEnd) UnregisterHotKey(Handle, HotKeyEnd); GlobalDeleteAtom(HotKeyEnd);
}
demo2:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
int tid;
strList=new TStringList();
tid=GlobalFindAtom(AnsiString("MyHotkey").c_str());
if(tid==0)
{
id=GlobalAddAtom(AnsiString("MyHotkey").c_str());
}
else
{
id=tid;
}
strList->Add(IntToStr(id));
RegisterHotKey(Handle, id, MOD_CONTROL, VK_F1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnregisterHotKey(Handle,StrToInt(strList->Strings[0]));
GlobalDeleteAtom(StrToInt(strList->Strings[0]));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
if(Msg.message==WM_HOTKEY && ((int)Msg.wParam)==StrToInt(strList->Strings[0]))
{
//SetForegroundWindow(Handle);
//ShowMessage("Ok");
this->Visible=!this->Visible;
}
}
最近我也刚试了热键
Ahift-ctrl-alt-<space>
Ahift-ctrl-alt-<return>
Ahift-ctrl-alt-<f1>
// 一、定义热键
#define HotkeyID1 0xb123
#define HotkeyID2 0xb124
#define HotkeyID3 0xb125
RegisterHotKey(Handle,HotkeyID1,
MOD_ALT+MOD_CONTROL+MOD_SHIFT,
VK_RETURN);
RegisterHotKey(Handle,HotkeyID2,
MOD_ALT+MOD_CONTROL+MOD_SHIFT,
VK_SPACE);
RegisterHotKey(Handle,HotkeyID3,
MOD_ALT+MOD_CONTROL+MOD_SHIFT,
VK_F1);
// 二、得到热键通知
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
if (Message.Msg==WM_HOTKEY) // LParamHi: VirtualKey
{ // LParamLo: key-modifier
if (Message.LParamHi==VK_RETURN)
;// 热键ID1处理
else
if (Message.LParamHi==VK_SPACE)
;// 热键ID1处理
else
if (Message.LParamHi==VK_F1)
;// 热键ID1处理
}
TForm::WndProc(Message);
}
// 三、注销热键
UnregisterHotKey(Handle,HotkeyID1);
UnregisterHotKey(Handle,HotkeyID2);
UnregisterHotKey(Handle,HotkeyID3);
demo3:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, Buttons, ComCtrls;typeTForm1 = class(TForm)BitBtn1: TBitBtn;HotKey1: THotKey;procedure BitBtn1Click(Sender: TObject);procedure FormCreate(Sender: TObject);privateprocedure wmhotkey(var Msg: TMessage); message WM_HOTKEY;{ Private declarations }public{ Public declarations }end;varForm1: TForm1;Key, Shift: Word; { TODO : 热键 }
implementation{$R *.dfm}
function ShiftStateToWord(Shift:TShiftState):Word;
beginResult:= 0; // 重要,网上的别的代码这儿没设置if ssShift in Shift then Result :=MOD_SHIFT;if ssCtrl in Shift then Result :=Result or MOD_CONTROL;if ssAlt in Shift then Result:=Result or MOD_ALT;
end;procedure ShortCutToKey(ShortCut: TShortCut; var Key: Word; var Shift: TShiftState);
beginKey := ShortCut and not (scShift + scCtrl + scAlt);Shift := [];if ShortCut and scShift <> 0 then Include(Shift, ssShift);if ShortCut and scCtrl <> 0 then Include(Shift, ssCtrl);if ShortCut and scAlt <> 0 then Include(Shift, ssAlt);
end;procedure TForm1.BitBtn1Click(Sender: TObject);
varT: TShiftState;
beginShortCutToKey(HotKey1.HotKey, Key, T);Shift := ShiftStateToWord(T);RegisterHotKey(Handle, GlobalAddAtom('MyHotKey') - $C000, Shift, Key);
end;procedure TForm1.wmhotkey(var Msg: TMessage);
beginif (Msg.LparamLo = Shift) and (Msg.LParamHi = Key) thenShowMessage('OK ');end;procedure TForm1.FormCreate(Sender: TObject);
beginRegisterHotKey(Handle, GlobalAddAtom('hotkey'), MOD_WIN, VK_SPACE); //spaceend;end.
demo4:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 = class(TForm)HotKey1: THotKey;Memo1: TMemo;CheckBox1: TCheckBox;CheckBox2: TCheckBox;CheckBox3: TCheckBox;CheckBox4: TCheckBox;procedure FormCreate(Sender: TObject);procedure CheckBox1Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.CheckBox1Click(Sender: TObject);
beginHotKey1.Modifiers := [];if CheckBox1.Checked then HotKey1.Modifiers := HotKey1.Modifiers + [hkShift];if CheckBox2.Checked then HotKey1.Modifiers := HotKey1.Modifiers + [hkCtrl];if CheckBox3.Checked then HotKey1.Modifiers := HotKey1.Modifiers + [hkAlt];if CheckBox4.Checked then HotKey1.Modifiers := HotKey1.Modifiers + [hkExt];
end;procedure TForm1.FormCreate(Sender: TObject);
beginMemo1.Clear;Memo1.Align := alTop;Memo1.ScrollBars := ssVertical;Memo1.Lines.Add('1、你现在看到的可不是 TEdit, 它是处理快捷键用的 HotKey 控件;');Memo1.Lines.Add('2、激活后, 输入几个字母试试;');Memo1.Lines.Add('3、按 Ctrl+*; * 表示任意键;');Memo1.Lines.Add('4、按 Ctrl+Alt+*;');Memo1.Lines.Add('5、按 Shift+Ctrl+* 或 Shift+Alt+* 都可以;');Memo1.Lines.Add('6、按 Shift+Ctrl+Alt+* 也可以;');Memo1.Lines.Add('7、但按 Shift+* 不可以; 因为 HotKey.InvalidKeys 默认禁止了它;');Memo1.Lines.Add('8、不过我们可以用 HotKey.Modifiers 打开它.');CheckBox1.Caption := 'hkShift';CheckBox2.Caption := 'hkCtrl';CheckBox3.Caption := 'hkAlt';CheckBox4.Caption := 'hkExt';CheckBox1.Checked := False;CheckBox2.Checked := False;CheckBox3.Checked := True;CheckBox4.Checked := False;CheckBox2.OnClick := CheckBox1.OnClick;CheckBox3.OnClick := CheckBox1.OnClick;CheckBox4.OnClick := CheckBox1.OnClick;
end;end.
BCB KEY/C++ 模拟虚拟键盘按键表
键盘VK键值列表
/* Virtual Keys, Standard Set*/
VK_LBUTTON 0x01
VK_RBUTTON 0x02
VK_CANCEL 0x03
VK_MBUTTON 0x04
#define VK_LBUTTON 0x01 //鼠标左键
#define VK_RBUTTON 0x02 //鼠标右键
#define VK_CANCEL 0x03 //Ctrl + Break
#define VK_MBUTTON 0x04 //鼠标中键/* NOT contiguous with L & RBUTTON */
#define VK_BACK 0x08 //Backspace 键
#define VK_TAB 0x09 //Tab 键
#define VK_CLEAR 0x0C
#define VK_RETURN 0x0D //回车键
#define VK_SHIFT 0x10
#define VK_CONTROL 0x11
#define VK_MENU 0x12 //Alt 键
#define VK_PAUSE 0x13
#define VK_CAPITAL 0x14 //Caps Lock 键
#define VK_KANA 0x15
#define VK_HANGEUL 0x15 /* old name - should be here for compatibility */
#define VK_HANGUL 0x15
#define VK_JUNJA 0x17
#define VK_FINAL 0x18
#define VK_HANJA 0x19
#define VK_KANJI 0x19
#define VK_ESCAPE 0x1B //Esc 键
#define VK_CONVERT 0x1C
#define VK_NONCONVERT 0x1D
#define VK_ACCEPT 0x1E
#define VK_MODECHANGE 0x1F
#define VK_SPACE 0x20 //空格
#define VK_PRIOR 0x21 //Page Up 键
#define VK_NEXT 0x22 //Page Down 键
#define VK_END 0x23 //End 键
#define VK_HOME 0x24 //Home 键
#define VK_LEFT 0x25 /*方向键*/
#define VK_UP 0x26
#define VK_RIGHT 0x27
#define VK_DOWN 0x28
#define VK_SELECT 0x29
#define VK_PRINT 0x2A
#define VK_EXECUTE 0x2B
#define VK_SNAPSHOT 0x2C //Print Screen 键
#define VK_INSERT 0x2D //Insert键
#define VK_DELETE 0x2E //Delete键
#define VK_HELP 0x2F
/* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
/* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
#define VK_LWIN 0x5B //左WinKey(104键盘才有)
#define VK_RWIN 0x5C //右WinKey(104键盘才有)
#define VK_APPS 0x5D //AppsKey(104键盘才有)
#define VK_NUMPAD0 0x60 //小键盘0-9
#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_MULTIPLY 0x6A //乘
#define VK_ADD 0x6B //加
#define VK_SEPARATOR 0x6C //除
#define VK_SUBTRACT 0x6D //减
#define VK_DECIMAL 0x6E //小数点
#define VK_DIVIDE 0x6F
#define VK_F1 0x70 //功能键F1-F24
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
#define VK_F8 0x77
#define VK_F9 0x78
#define VK_F10 0x79
#define VK_F11 0x7A
#define VK_F12 0x7B
#define VK_F13 0x7C
#define VK_F14 0x7D
#define VK_F15 0x7E
#define VK_F16 0x7F
#define VK_F17 0x80
#define VK_F18 0x81
#define VK_F19 0x82
#define VK_F20 0x83
#define VK_F21 0x84
#define VK_F22 0x85
#define VK_F23 0x86
#define VK_F24 0x87
#define VK_NUMLOCK 0x90 //Num Lock 键
#define VK_SCROLL 0x91 //Scroll Lock 键
/*
* VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
* Used only as parameters to GetAsyncKeyState() and GetKeyState().
* No other API or message will distinguish left and right keys in this way.
*/
#define VK_LSHIFT 0xA0
#define VK_RSHIFT 0xA1
#define VK_LCONTROL 0xA2
#define VK_RCONTROL 0xA3
#define VK_LMENU 0xA4
#define VK_RMENU 0xA5
#if(WINVER >= 0x0400)
#define VK_PROCESSKEY 0xE5
#endif /* WINVER >= 0x0400 */
#define VK_ATTN 0xF6
#define VK_CRSEL 0xF7
#define VK_EXSEL 0xF8
#define VK_EREOF 0xF9
#define VK_PLAY 0xFA
#define VK_ZOOM 0xFB
#define VK_NONAME 0xFC
#define VK_PA1 0xFD
#define VK_OEM_CLEAR 0xFE
如何注册全局热键(c++builder)
这样吧,我给你一个例程,包括了ResiterHotKey的用法和消息处理的用法,你仔细看看吧。
这个程序有一个窗体Form1,Form1上注册了一个热键Ctrl+F11,以后只要这个程序在运行,不管在什么,你一按Ctrl+F11, 就会弹出一个消息框。
//Unit.H
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
//这个函数就是消息处理函数,通过VCL_MESSAGE_HANDLER宏和指定消息相连
void __fastcall WMHotKey(TMessage &Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
//以下三句就是消息处理,可以在BEGIN和END之间加入多个HANDLER
BEGIN_MESSAGE_MAP
//处理WM_HOTKEY消息,注册热键之后,按下热键就会向指定窗口发出该消息
VCL_MESSAGE_HANDLER(WM_HOTKEY, TMessage, WMHotKey);
END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//Unit1.CPP
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//这就是消息处理函数的实现
void __fastcall TForm1::WMHotKey(TMessage &Msg)
{
SetForegroundWindow(Handle);
ShowMessage("Hot Key Registered!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
RegisterHotKey(Handle, 0x1000, MOD_CONTROL, VK_F11);
//以上那句注册热键,Handle是窗口句柄,0x1000是一个ID号,设置该热键在线程中
//的唯一值,第三个参数表示要按下那些系统键,最后一个是按键的虚拟键码
//具体可参见MSDN帮助
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnregisterHotKey(Handle, 0x1000);
//注销热键,0x1000和上面对应,指明注销哪个热键
}
C++ builder热键处理方式(HotKey)相关推荐
- linux下qt响应全局热键,Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)...
Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...
- windows全局热键_适用于Windows PC的20种最佳快捷方式和热键提示
windows全局热键 For those of you who like to use the quickest methods of getting things done on your com ...
- kvm显示器怎么切换服务器,kvm切换器一套键盘鼠标显示器的热键切换方法教程
kvm切换器,在我们的生活中已经是很常见的一种机器:当我们拥有多个信号源却只有一显示设备的时候,我们不妨考虑一下kvm切换器这种产品,一套键盘鼠标显示器控制多台计算机设备:它能让你省时更省力. 今天给 ...
- Java构造之builder模式
文章来源:Effective Java第二章 常规构造的方式有两种:构造器structure和静态工厂static factory method:静态工厂相比构造器有以下几点优势: 1.静态工厂有名称 ...
- RPG Maker MV/ MZ 工程打包 Android APK 文件(使用 Website 2 APK Builder Pro)
演示环境:Win 10, RPG Maker MV v1.6.2, JDK 11, Website 2 APK Builder Pro v5.0 目录 前文 下载安装 安装 Website 2 APK ...
- Java 实现线程安全的方式
1.创建线程的三种方式 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 2.线程的生命周期 新建状态: 使用 new 关键字 ...
- 用RegisterHotKey注册系统热键
函数功能:该函数定义一个系统范围的热键. 函数原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk): 参数: hWnd:接 ...
- PC端键盘热键如何与页面交互
什么是热键 在交互设计中,快捷键和键盘热键是提高用户效率和提升用户体验的重要手段之一.在PC端应用和网页设计中,合理运用键盘热键可以帮助用户快速完成操作,提高工作效率和使用体验.本文将介绍PC端键盘热 ...
- 【Cadence0】OrCAD Library Builder16.6.62 吴川斌的博客独家版;使用OrCAD Library Builder来创建一个多达1680pin的BGA封装也就分分钟的事情
OrCAD Library Builder 16.6.62 吴川斌的博客独家版 Cadence Allegro, Cadence OrCAD by xfire OrCAD Library Builde ...
- Delphi与C++Builder代码共享的实现
原文地址: http://blog.chinaunix.net/uid-16175364-id-2752232.html Delphi与C++Builder代码共享的实现 2006-10-30 13: ...
最新文章
- el图片滚动_element的el-table中记录滚动条位置的示例代码
- linux写命令时方便的快捷键以及Vim必备命令
- 三十三、数据仓库的概述
- Android 系统(83)---屏幕尺寸
- 晨哥真有料丨你喜欢人家啊,你追求人家。你到了什么地步就该放弃了?
- c#打开文件程序闪退_C#调用易语言dll第二次就闪退
- react-native相机
- 使用Flask在Raspberry Pi上构建物联网服务器
- android 5.1 改mac地址,mac地址可以随便改吗
- 2018黑马java简历模板_2018黑马软件测试
- 最新使用Python进行开发网站教程项目实战(完整)
- 连接服务器框架协议通信,通信服务协议范本3篇.doc
- Springboot 静态资源路径配置 实例介绍
- RPM构建 - SPEC文件参数解析
- 计算两个矩形的IOU交并比_Python
- 两台windows电脑互相备份
- mysql 中间表 性能_mysql性能优化
- tsp java_基于贪心算法求解TSP问题(JAVA)
- 资源警告!有人收罗了40个中文NLP词库,放到了GitHub上
- coursera无法播放视频
热门文章
- 用css做一个梦幻西游动画特效
- 基于PHP+mysql的学生管理系统班级网站同学录
- pack_padded_sequence;pad_packed_sequence
- busybox制作的rootfs,启动脚本修改定制
- Qt 一个简单的基于mplayer的视频播放器
- MATLAB地图工具箱学习总结(三)地图工具箱的基本知识
- 对于PS选区的初步认识
- 计算机桌面应用程序图标不见了怎么办,桌面程序图标不见了,桌面软件快捷方式不见了怎么办?...
- Java8 stream新定义运算
- Internet连接共享只能上qq不能打开网页的问题解决