2007-07-30 09:48
[问题提出]
有的程序需要自定义组合键完成一定功能,如何实现? [解决方法] 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+E的快捷键组合功能.在调用该函数后你的进程会在ALT+E按下时比系统先得到通知.你需要处理的消息是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_E); 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+E"); //加入相关代码. return 0; } |