这也是一个思路,通过SendMessage注册发送到soft key bar 的热键,捕获一些硬按键。下面以捕获VK_TTALK拨号键为例说明应用。
LRESULT CAboutDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
SHMENUBARINFO mbi;
ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hwndParent = m_hWnd;
mbi.hInstRes = _Module.GetModuleInstance();
mbi.dwFlags = SHCMBF_HIDESIPBUTTON|SHCMBF_HMENU; //加上SHCMBF_HIDESIPBUTTON能够隐藏输入法图标。
mbi.nToolBarId=IDR_MENU_ABOUT;
SHCreateMenuBar(&mbi);
SendMessage(mbi.hwndMB, SHCMBM_OVERRIDEKEY, VK_TTALK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
return bHandled = FALSE;
}
}
LRESULT CAboutDlg::OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int idHotKey, uVirtualKey;
idHotKey = LOWORD(lParam);
uVirtualKey = HIWORD(lParam);
switch(uVirtualKey)
{
case VK_TTALK:
MessageBox(_T("VK_TTALK"), _T("test"), 0);
break;
case VK_TEND://此方法不支持使用VK_TEND;详见SHCMBM_OVERRIDEKEY的介绍.
break;
}
{
int idHotKey, uVirtualKey;
idHotKey = LOWORD(lParam);
uVirtualKey = HIWORD(lParam);
switch(uVirtualKey)
{
case VK_TTALK:
MessageBox(_T("VK_TTALK"), _T("test"), 0);
break;
case VK_TEND://此方法不支持使用VK_TEND;详见SHCMBM_OVERRIDEKEY的介绍.
break;
}
return bHandled = FALSE;;
}
}
通过这种方法能够捕获的消息是有限的,对于SP,能够捕获以下消息:
VK_TSOFT1, VK_TSOFT2, VK_TBACK, VK_TVOLUMEUP, VK_TVOLUMEDOWN, VK_TTALK and VK_TRECORD;
对于PPC,能够捕获:VK_TTALK
SHCMBM_OVERRIDEKEY的相关链接:http://msdn.microsoft.com/en-us/library/aa454997.aspx