程序热键的实现

[问题提出] 有的程序需要自定义组合键完成一定功能,如何实现?

[解决方法] RegisterHotKey函数原型及说明: BOOL RegisterHotKey( HWND hWnd, // 接收WM_HOTKEY的窗口句柄 int id, // hot key的ID号. UINT fsModifiers, // 响应那个热键. UINT vk // 与热键配合的键.

其中:
    1)id的说明:
    id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000  -  0xBFFF范围之内,对DLL来讲其值必需在0xC000  -  0xFFFF  范围之内,在同一进程内该值必须唯一

    2)fsModifiers的取值如下:
        .MOD_ALT
        .MOD_CONTROL
        .MOD_SHIFT
        .MOD_WIN

[程序实现] 建立名为My的对话框工程.本例要用到RegisterHotKey()实现Alt+D的快捷键组合功能.在调用该函数后你的进程会在ALT+D按下时比系统先得到通知.你需要处理的消息是WM_HOTKEY. 如下:

在MyDlg.h中:
class  CMyDlg  :  public  CDialog
{
          //  Construction
          public:
                  int  m_nHotKeyID;//为你自己定义的一个hot  key的ID值,在整个程序唯一.
          ........
          protected:
                  HICON  m_hIcon;

          //  Generated  message  map  functions
          //{AFX_MSG(CMyDlg)
          virtual  BOOL  OnInitDialog();
          afx_msg  void  OnSysCommand(UINT  nID,  LPARAM  lParam);
          afx_msg  void  OnPaint();
          afx_msg  HCURSOR  OnQueryDragIcon();
          afx_msg  LONG  OnHotKey(WPARAM  wParam,LPARAM  lParam);//手动加入.
          //}AFX_MSG
          DECLARE_MESSAGE_MAP()
};

在MyDlg.cpp中:
#define  VK_D  68

..............
BEGIN_MESSAGE_MAP(CMyDlg,  CDialog)
          //{AFX_MSG_MAP(CHotKey1Dlg)
          ON_WM_SYSCOMMAND()
          ON_WM_PAINT()
          ON_WM_QUERYDRAGICON()
          ON_BN_CLICKED(IDOK,  OnRegisterHotKey)
          ON_BN_CLICKED(IDCANCEL,  OnUnregisterHotKey)
          ON_MESSAGE(WM_HOTKEY,OnHotKey)                                          //手动加入.
          //}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL  CMyDlg::OnInitDialog()
{
          CDialog::OnInitDialog();

          //  Add  "About..."  menu  item  to  system  menu.
          m_nHotKeyID=0;
          BOOL  m_isKeyRegistered  =  RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
          ASSERT(m_isKeyRegistered  !=  FALSE);
          return  TRUE;    //  return  TRUE    unless  you  set  the  focus  to  a  control
}

在取消按钮的事件函数中加入:
void  CMyDlg::OnCancel()
{
          BOOL  m_iskeyUnregistered  =  UnregisterHotKey(GetSafeHwnd(),  m_nHotKeyID);
          ASSERT(m_iskeyUnregistered  !=  FALSE);
          CDialog::OnCancel();
}

处理截到的组合键,并处理:
LONG  CMyDlg::OnHotKey(WPARAM  wParam,LPARAM  lParam)
{
          AfxMessageBox("你按下了组合键:Alt+D");
          //加入相关代码.
          return  0;
}

大家试试此功能,希望有不对之处给以指正.
支持原创技术分享,据说打赏我的人,都找到了女朋友!