zoukankan      html  css  js  c++  java
  • RegisterHotKey的具体使用方法

    使用方法如下:

    BOOL   RegisterHotKey(
    HWND   hWnd,         //响应该热键的窗口句柄
    Int   id,                       //该热键的唯一标识
    UINT   fsModifiers,   //该热键的辅助按键
    UINT   vk                 //该热键的键值
    );  

    为了得到唯一标识,我们还将用到另一个API函数  

    ATOM   GlobalAddAtom(

    LPCTSTR   lpString   //自己设定的一个字符串

    );

    因为我们还要在程序退出的时候,消除这个热键,   所以需要声明一个全局变量:  

    HotKeyId:   Integer;  

       

    第一步:  

    在窗口的create事件中,加入以下代码  

    HotKeyId   :=   GlobalAddAtom(‘MyHotKey’)   -   $C000;
    注:   HotKeyId的合法取之范围是0x0000到0xBFFF之间,   GlobalAddAtom函数得到的值
    在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。

    第二步:  

    在上面的代码下面加入:  

    RegisterHotKey(Handle,   hotkeyid,   MOD_ALT,   VK_F8);    

    热键的辅助按键包括Mod_Ctrl   、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows
    键,即其键面上有Windows标志的那个键,其值为Mod_win。

    上面   的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8,   就这么写:

    RegisterHotKey(Handle,   hotkeyid,   0,   VK_F8);    

    注:handle是一个特殊的变量,它表示当前窗口的句柄。

    这个函数你应该能句举一反三了吧。

    原理:

    一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应
    用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消
    息的格式为:    

    idHotKey   =   (int)   wParam;   //   该参数在设置系统级的热键有用,一般不予使用
    fuModifiers   =   (UINT)   LOWORD(lParam);     //热键的辅助按键
    uVirtKey   =   (UINT)   HIWORD(lParam);   //热键的键值  

       

    第三步:  

    注册了热键,就该写下响应代码了。  

    首先,在程序头部分的private段中加入声明   (作用是声明这个过程,和声明变量类似。
    关于如何声明函数、过程,请请参考各自的帮助文件或其它资料):  

    procedure   HotKeyDown(var   Msg:   Tmessage);   message   WM_HOTKEY;  

       

    然后在程序中加入如下代码:  

    procedure   Tfmain.HotKeyDown(var   Msg:   Tmessage);  

    begin  

    if   (Msg.LparamLo   =   MOD_ALT)   AND   Msg.LParamHi   =   VK_F8   then   //   假设热键为ALT+F8  

    begin  

    end;  

    最后一步:  

    在窗口的close事件中加入  

    UnRegisterHotKey(handle,   HotKeyId);   //注销HotKey,   释放资源

    VB中用API函数RegisterHotKey注册系统热键
    使用RegisterHotkey的概念是,它会定义一组或单个按键的组合,不管在哪个程序之中,按下程序窗体有注册的HotKey时,系统会传送WM_HOTKEY 的讯息给待接收该讯息的程序窗体,而该程序窗体接收到WM_HOTKEY时,便可知道有本身Thread所定义的HotKey被按下,於是可以从wParam, lParam来得知是哪一组HotKey被按下,从而执行相应的操作.

    函数声明的定义如下:
    RegisterHotKey(
       ByVal hwnd As Long ,     //接收自定义热键的窗口的HWND
       ByVal idHotKey as Long,   //id为你自己定义的一个ID值对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,十进制为0~49151, 对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,十进制为49152~65535,在同一进程内该值必须唯一参数 fsModifiers指明与热键联合使用按键
       ByVal Modifiers As Long,   // 指明与热键联合使用按键(ALT,SHIFT,CTR的组合)如不需可置空
    ,可取值为:MOD_ALT, MOD_CONTROL, MOD_WIN, MOD_SHIFT参数,或数字0为无,1为Alt,2为Control,4为Shift,8为Windows

       ByVal uVirtKey As Long   //定主你自定的HOTKEY的虚拟按键码
       )

    WM_HOTKEY 叁数的定义
    idHotKey = wParam;          
    Modifiers = (UINT) LOWORD(lParam);
    uVirtKey = (UINT) HIWORD(lParam);  

    所以了,除了设定RegisterHotkey外,另要使用SubClassing的技巧才会得知HotKey被按
    下;最後,程序结束前要使用UnRegisterHotkey将HotKey的定义取消掉。切记,一定要有用有还!!!

    以下程序功能是:不管在哪个程序中,只要按下ALT-SHIFT-G 便执行NotePad。
    '以下在.Bas
    Option Explicit

    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
       ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long

    Public Const WM_HOTKEY = &H312
    Public Const MOD_ALT = &H1
    Public Const MOD_CONTROL = &H2
    Public Const MOD_SHIFT = &H4
    Public Const GWL_WNDPROC = (-4)

    Public preWinProc As Long
    Public Modifiers As Long, uVirtKey As Long, idHotKey As Long

    Private Type taLong
       ll As Long
    End Type
    Private Type t2Int
       lWord As Integer
       hword As Integer
    End Type
    Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
                     ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_HOTKEY Then
       If wParam = idHotKey Then
         Dim lp As taLong, i2 As t2Int
         lp.ll = lParam
         LSet i2 = lp
         If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then
           ‘此处为接收到热键后需执行的操作
         End If
       End If
    End If
    '将之送往原来的Window Procedure
    wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
    End Function

    '以下在 Form
    Sub Form_Load()
    Dim ret As Long
    preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
    ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
    idHotKey = 1 'in the range &h0000 through &hBFFF
    Modifiers = MOD_ALT + MOD_SHIFT
    uVirtKey = vbKeyG
    ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    Dim ret As Long
    '取消Message的截取,而使之又只送往原来的Window Procedure
    ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
    Call UnregisterHotKey(Me.hwnd, uVirtKey)
    End Sub

  • 相关阅读:
    default关键字用法
    【转载】SpringMvc和servlet简单对比介绍
    build模式入门,build模式理解(转载)
    tomcat logs 目录下各日志文件的含义
    @Component, @Repository, @Service,@Controller的区别
    在项目开发时为什么要先写接口,再写实现类?
    java 中static关键字注意事项
    this关键字使用注意事项
    两个对象之前如何建立联系
    html页面监听事件
  • 原文地址:https://www.cnblogs.com/rosesmall/p/2693707.html
Copyright © 2011-2022 走看看