加速键 (Accelerator)和 热键(HotKey)
加速键 和 热键 是两种不同的快捷键(我这里暂且把它们都称为快捷键,而其他人可能只把后者称为快捷键。)应尽量避免冲突。
加速键 (Accelerator)
一种是直接与菜单项关联的加速键
另一种就是自定义的加速键.
第一种: (如果是基于对话框的工程,我们先添加菜单和加速键资源,然后右击主对话框属性添加菜单)
首先在资源文件Accelerator中添加快捷键资源 ID选择你要关联菜单项的名称 然后再设置你的快捷键.什么?下一步?在.h文件中加入一个 HACCEL hAccel;变量 然后在OnInitDialog或初始化中加入hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1)); 后面的参数是加速键资源文件名.
最后在PreTranslateMessage(MSG* pMsg) 中加入:
if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))
return true;
这样 以后只要在Accelerator资源文件中添加快捷键就可以了
注意: 添加快捷键的ID一定要与菜单ID一样 这样才能响应.现在只需要在此菜单项中加入OnCommand消息的处理就可以了.
第二种: 还是在资源文件Accelerator中添加快捷键资源 ID自己定义一个.然后再设置你的快捷键.下一步...就是在.h文件中定义一个快捷键对象
HACCEL m_hAccel;
然后在.cpp文件中初始
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
IDR_ACCELERATOR1为你的加速资源名称.注意不是刚刚定义的加速键ID.
再添加PreTranslateMessage消息处理 在里面加入以下代码:
//保存快捷键被启用
if(m_hAccel != NULL)
{
if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
return TRUE;
}
再添加OnCommand消息处理 加入以下代码:
//响应加速键
switch(LOWORD(wParam))
{
case SHOW_DIAL0G: //加速键ID
//...添加处理语句
break;
case SHOW_DIALOG_02: //加速键ID
//...添加处理语句
break;
}
自己加的:在我看的代码中,它是利用对话框加菜单的,当加了菜单后,把菜单挂到对话框,然后响应一个菜单项.再在对话框类中加虚函数PreTranslateMessage,在些数里的代码如下:
if( pMsg->message==WM_KEYDOWN)
{
if(pMsg->wParam==VK_F2)
this->PostMessage(WM_COMMAND,IDM_SHOW);//IDM_SHOW是响应的菜单项ID
}
return CDialog::PreTranslateMessage(pMsg);
这样我就可以响应F2的加速键了!!
转载:http://www.cnblogs.com/thankgoodness/articles/1136617.html
热键(hotkey)
热键一般是有Ctrl+其他键位或Alt+其他键位或Ctrl+Alt+其他键位构成。关于如何建立自己的热键,
下面就有详细的说明:
1:要定义一个热键(组合键)即必须先为热键赋于一个自定义的ID,用来给系统标识该热键。注意,
自定义的ID(int型)必须是唯一的,既不能与系统的其他ID相冲突。
2 运用函数RegisterHotKey
(
HWND hWnd, // 接收WM_HOTKEY的窗口句柄
int id, // hot key的ID号.
UINT fsModifiers, // 响应那个热键.
UINT vk // 与热键配合的键虚位码
)
当配合建为a(A) —z(Z),
和 0 — 9时,伴随建虚伪码可以用诸如'a','0'的形式代替。hWnd 为接受热键的窗口句柄,可以用
GetSafeHwnd()函数获得。自定义热键ID对于一个线程来讲一般设在0x0000 到0xBFFF(49151)之间,对于一个
DLL来讲其值一般设在0xC000(49152) 到0xBFFF(49151)之间。
fsModifiers可取如下值
MOD_ALT ;MOD_CONTROL ;MOD_SHIFT ;MOD_WIN 或他们的组合(中间用|连接)
3 定义热键的同时一般也要自定义热键相应的响应函数,其定义方法如下:
(1):先在某个类的头文件的其他消息响应函数的声明处按照相应的格式加上如下语句
afx_msg long OnHotKey(WPARAM wParam,LPARAM lParam);//wParam一般为热键消息的ID
(2): 在相应类的.cpp文件的消息映射宏BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间加上同其他消息
响应宏声明相同格式的自定义消息响应宏ON_MESSAGE(WM_HOTKEY,OnHotKey)
(3):然后就运用RegisterHotKey(...)函数定义快捷键。并在相应的消息响应函数OnHotKey(...)中加
如相应的处理代码。注意消息响应函数一定要有返回值,其可以使HRESULT,int ,long等数据类
型。
(4): 用完后不要忘了在OnDestory(...)函数或OnCancel(...)中解除函数登记,释放系统资源。此时
要调用函数 bool UnregisterHotKey(hWnd,VK(ID));
4 相应的例子如:
[程序实现]
建立名为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) //wParam一般为热键消息的ID
{
AfxMessageBox("你按下了组合键:Alt+D");
//加入相关代码.
return 0;
}
为了您的安全,请只打开来源可靠的网址
来自: http://hi.baidu.com/sworssman/blog/item/285797b44cfe86788bd4b228.html