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)相关推荐

  1. linux下qt响应全局热键,Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)...

    Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...

  2. windows全局热键_适用于Windows PC的20种最佳快捷方式和热键提示

    windows全局热键 For those of you who like to use the quickest methods of getting things done on your com ...

  3. kvm显示器怎么切换服务器,kvm切换器一套键盘鼠标显示器的热键切换方法教程

    kvm切换器,在我们的生活中已经是很常见的一种机器:当我们拥有多个信号源却只有一显示设备的时候,我们不妨考虑一下kvm切换器这种产品,一套键盘鼠标显示器控制多台计算机设备:它能让你省时更省力. 今天给 ...

  4. Java构造之builder模式

    文章来源:Effective Java第二章 常规构造的方式有两种:构造器structure和静态工厂static factory method:静态工厂相比构造器有以下几点优势: 1.静态工厂有名称 ...

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

  6. Java 实现线程安全的方式

    1.创建线程的三种方式 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 2.线程的生命周期 新建状态: 使用 new 关键字 ...

  7. 用RegisterHotKey注册系统热键

    函数功能:该函数定义一个系统范围的热键. 函数原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk): 参数: hWnd:接 ...

  8. PC端键盘热键如何与页面交互

    什么是热键 在交互设计中,快捷键和键盘热键是提高用户效率和提升用户体验的重要手段之一.在PC端应用和网页设计中,合理运用键盘热键可以帮助用户快速完成操作,提高工作效率和使用体验.本文将介绍PC端键盘热 ...

  9. 【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 ...

  10. Delphi与C++Builder代码共享的实现

    原文地址: http://blog.chinaunix.net/uid-16175364-id-2752232.html Delphi与C++Builder代码共享的实现 2006-10-30 13: ...

最新文章

  1. el图片滚动_element的el-table中记录滚动条位置的示例代码
  2. linux写命令时方便的快捷键以及Vim必备命令
  3. 三十三、数据仓库的概述
  4. Android 系统(83)---屏幕尺寸
  5. 晨哥真有料丨你喜欢人家啊,你追求人家。你到了什么地步就该放弃了?
  6. c#打开文件程序闪退_C#调用易语言dll第二次就闪退
  7. react-native相机
  8. 使用Flask在Raspberry Pi上构建物联网服务器
  9. android 5.1 改mac地址,mac地址可以随便改吗
  10. 2018黑马java简历模板_2018黑马软件测试
  11. 最新使用Python进行开发网站教程项目实战(完整)
  12. 连接服务器框架协议通信,通信服务协议范本3篇.doc
  13. Springboot 静态资源路径配置 实例介绍
  14. RPM构建 - SPEC文件参数解析
  15. 计算两个矩形的IOU交并比_Python
  16. 两台windows电脑互相备份
  17. mysql 中间表 性能_mysql性能优化
  18. tsp java_基于贪心算法求解TSP问题(JAVA)
  19. 资源警告!有人收罗了40个中文NLP词库,放到了GitHub上
  20. coursera无法播放视频

热门文章

  1. 用css做一个梦幻西游动画特效
  2. 基于PHP+mysql的学生管理系统班级网站同学录
  3. pack_padded_sequence;pad_packed_sequence
  4. busybox制作的rootfs,启动脚本修改定制
  5. Qt 一个简单的基于mplayer的视频播放器
  6. MATLAB地图工具箱学习总结(三)地图工具箱的基本知识
  7. 对于PS选区的初步认识
  8. 计算机桌面应用程序图标不见了怎么办,桌面程序图标不见了,桌面软件快捷方式不见了怎么办?...
  9. Java8 stream新定义运算
  10. Internet连接共享只能上qq不能打开网页的问题解决