我的是用vc写的一个后台程序,怎么设计系统热键,需要的时候把它呼叫出来?
而且,当焦点不落在这个程序的时候,也可以呼出来吗?

解决方案 »

  1.   

    一般的做法是:在init中做完必要的操作后,先注册一个系统热键,程序退出后释放掉。系统热键的注册  根据前面的介绍,不难写出为后台服务程序添加对系统热键响应的功能代码。首先通过函数GlobalFindAtom()查询本服务程序所对应的全局原子是否已存在于全局原子表中,如果发现,则说明系统中已经存在有此服务,程序退出。如果没有发现,则通过GlobalAddAtom()函数向全局原子表添加一个字串,并获取得到一个唯一标识此字串的原子。以上两函数原型分别为:ATOM GlobalFindAtom(LPCTSTR lpString);
    ATOM GlobalAddAtom(LPCTSTR lpString);   其中,输入参数为一个描述原子的字符串,如果GlobalFindAtom()从全局原子表中找到了指定的字串,那么将返回此字串对应的原子,否则返回0。GlobalAddAtom()如果创建成功,将返回一个新创建的原子。
    接下来,为了能在程序运行期间捕获到系统热键,需要通过RegisterHotKey()定义一个系统范围的热键。该函数原形如下:BOOL RegisterHotKey(HWND hWnd, // 接收热键响应的窗口句柄
    int id, // 热键的标识
    UINT fsModifiers, // 控制键标志
    UINT vk // 虚拟键值
    );   其中,热键标识id必须是一个范围在0xC000到0xFFFF之间的全局唯一的值,为了避免可能引起的热键冲突,通常把GlobalAddAtom()返回的原子作为参数传入,而且GlobalAddAtom()返回值的范围同id参数的允许范围是完全一致的。参数fsModifiers定义了同虚拟键值vk同时按下而产生出系统热键消息WM_HOTKEY的控制键组合,如MOD_ALT、MOD_CONTROL、MOD_SHIFT和MOD_WIN等。在本例中将要设定的系统热键为Alt+Ctrl+R,因此,参数fsModifiers和vk分别设置为MOD_ALT| MOD_CONTROL和VK_R。有关系统热键的注册实现方法可以整理如下:// 获取当前窗口句柄
    HWND handle = GetSafeHwnd();
    // 寻找HotKey对应的原子是否存在于原子列表
    if(GlobalFindAtom("Hotkey") == 0)
    {
    // 如果没有存在于原子列表,则创建一个原子
    id = GlobalAddAtom("Hotkey"); 
    //注册全局热键Ctrl + Alt + R
    RegisterHotKey(handle, id, CONTROL + ALT, R); 
    }
    else // 如果HotKey已经存在于原子列表,则终止程序运行
    PostQuitMessage(0); 
      

  2.   

    运用函数
    BOOL RegisterHotKey(HWND hWnd, // 接收热键响应的窗口句柄
    int id, // 热键的标识
    UINT fsModifiers, // 控制键标志
    UINT vk // 虚拟键值
    ); 
    注册热键,然后自己定义热键处理的消息,绑定到处理该消息的函数即可。
      

  3.   

    RegisterHotKey()就搞定了,至于第二个函数,一般来说你可以随意指定,比如直接指定为17,3,都可以。