我想做一个用户自定义热键和时间,然后响应的程序。(类似按键精灵)
但是出现了一个问题,就是我的程序只能在对话框中响应开启热键的行为。其他程序不响应。
我用的是vs2010 hotkey 控件。
附上代码:
void CkeyboardDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UpdateData(TRUE);
if (nIDEvent==1) //模拟键盘按下
{
keybd_event(m_hotkey1.GetHotKey(),0,0,0); //获取hotkey1的热键,键值,按下。
keybd_event(m_hotkey1.GetHotKey(),0,KEYEVENTF_KEYUP,0); //弹起
}
if (nIDEvent==2) //模拟键盘按下
{
keybd_event(m_hotkey2.GetHotKey(),0,0,0);
keybd_event(m_hotkey2.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==3) //模拟键盘按下
{
keybd_event(m_hotkey3.GetHotKey(),0,0,0);
keybd_event(m_hotkey3.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==4) //模拟键盘按下
{
keybd_event(m_hotkey4.GetHotKey(),0,0,0);
keybd_event(m_hotkey4.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==5) //模拟键盘按下
{
keybd_event(m_hotkey5.GetHotKey(),0,0,0);
keybd_event(m_hotkey5.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==6)
{ }
UpdateData(FALSE);
CDialogEx::OnTimer(nIDEvent);
}BOOL CkeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData(TRUE);
if ((pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_SYSKEYDOWN))
{
if (pMsg->wParam == m_hotbegin.GetHotKey()) //如果是开始热键被按下则
{
SetTimer(5,m_ntime5,NULL); //设置定时器(运行定时器5,热键时间)
SetTimer(4,m_ntime4,NULL);
SetTimer(3,m_ntime3,NULL);
SetTimer(2,m_ntime2,NULL);
SetTimer(1,m_ntime1,NULL);
KillTimer(6); //停止定时器6
}
if (pMsg->wParam == m_hotend.GetHotKey())
{
KillTimer(1); //结束定时器
KillTimer(2); //结束定时器
KillTimer(3);
KillTimer(4);
KillTimer(5);
SetTimer(6,10,NULL); //使定时器6生效
}
}
UpdateData(FALSE);
return CDialogEx::PreTranslateMessage(pMsg);
}我怀疑是我的PreTranslateMessage处理有问题。请高手给我指点一下。万分感谢。
但是出现了一个问题,就是我的程序只能在对话框中响应开启热键的行为。其他程序不响应。
我用的是vs2010 hotkey 控件。
附上代码:
void CkeyboardDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UpdateData(TRUE);
if (nIDEvent==1) //模拟键盘按下
{
keybd_event(m_hotkey1.GetHotKey(),0,0,0); //获取hotkey1的热键,键值,按下。
keybd_event(m_hotkey1.GetHotKey(),0,KEYEVENTF_KEYUP,0); //弹起
}
if (nIDEvent==2) //模拟键盘按下
{
keybd_event(m_hotkey2.GetHotKey(),0,0,0);
keybd_event(m_hotkey2.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==3) //模拟键盘按下
{
keybd_event(m_hotkey3.GetHotKey(),0,0,0);
keybd_event(m_hotkey3.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==4) //模拟键盘按下
{
keybd_event(m_hotkey4.GetHotKey(),0,0,0);
keybd_event(m_hotkey4.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==5) //模拟键盘按下
{
keybd_event(m_hotkey5.GetHotKey(),0,0,0);
keybd_event(m_hotkey5.GetHotKey(),0,KEYEVENTF_KEYUP,0);
}
if (nIDEvent==6)
{ }
UpdateData(FALSE);
CDialogEx::OnTimer(nIDEvent);
}BOOL CkeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
UpdateData(TRUE);
if ((pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_SYSKEYDOWN))
{
if (pMsg->wParam == m_hotbegin.GetHotKey()) //如果是开始热键被按下则
{
SetTimer(5,m_ntime5,NULL); //设置定时器(运行定时器5,热键时间)
SetTimer(4,m_ntime4,NULL);
SetTimer(3,m_ntime3,NULL);
SetTimer(2,m_ntime2,NULL);
SetTimer(1,m_ntime1,NULL);
KillTimer(6); //停止定时器6
}
if (pMsg->wParam == m_hotend.GetHotKey())
{
KillTimer(1); //结束定时器
KillTimer(2); //结束定时器
KillTimer(3);
KillTimer(4);
KillTimer(5);
SetTimer(6,10,NULL); //使定时器6生效
}
}
UpdateData(FALSE);
return CDialogEx::PreTranslateMessage(pMsg);
}我怀疑是我的PreTranslateMessage处理有问题。请高手给我指点一下。万分感谢。
参考:
LoadAccelerators
TranslateAccelerator