如何在对话框中响应快捷键?
我要在基于对话框的程序中响应快捷键,比如按“CTRL+0”系统就调用相应的处理函数,请问该如何实现? 问题点数:50、回复次数:10Top
1 楼wild()回复于 2000-04-29 20:16:00 得分 0
方法有很多,提供几个思路:
可以重载PreTranslateMessage()捕获WM_KEYDOWN消息,并处理某一键值。
可以通过键盘HOOK.Top
2 楼danial(孤鸿)回复于 2000-05-10 11:12:00 得分 0
谢谢wild提供的思路。能否给出PreTranslateMessage()实现的源代码以供参考?Top
3 楼wild()回复于 2000-05-11 01:33:00 得分 0
BOOL CMyEditCtrl::PreTranslateMessage(MSG * pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
switch(pMsg->wParam)
{
case CTRL_0: /*handle Ctrl-0*/ return TRUE; //end the message routing
default: break;
}
break;
// TO Handle more messages here.
// case WM_xxx: break;
default: break;
}
// default handle of Edit control
return CEdit::PreTranslateMessage(pMsg);
}Top
4 楼danial(孤鸿)回复于 2000-05-18 15:01:00 得分 0
VC好象不能识别CTRL_0宏吧?Top
5 楼danial(孤鸿)回复于 2000-06-08 12:36:00 得分 0
我现在要响应的快捷键是复合键,可在用PreTranslateMessage()捕获消息WM_KEYDOWN时,刚按下一个键(如Ctrl或0)就进入PreTranslateMessage()函数,请问我该如何同时检测到Ctrl和0键的按下呢?Top
6 楼wild()回复于 2000-06-09 01:28:00 得分 0
用GetKeyState()吧,可以检测所有键的状态
SHORT GetKeyState(
int nVirtKey // virtual-key code
);
If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. A key, such as the caps lock key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
另外,可以参考 GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey
详细情况查MSDN,注意这个函数区分左右Control,Alt,and Shift.
!!!
不妨这样做:
PreTranslate中捕获 0 键按下消息,这时使用GetKeyState(), 检测VK_RCTRL and VK_LCTRL,如下:
BOOL CMyDialog::PreTranslateMessage(MSG * pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
switch(pMsg->wParam)
{
case VK_0:
/*handle Ctrl-0*/ return TRUE; //end the message routing
default: break;
}
break;
// TO Handle more messages here.
// case WM_xxx: break;
default: break;
}
// default handle of Edit control
return CEdit::PreTranslateMessage(pMsg);
}Top
7 楼wild()回复于 2000-06-09 01:30:00 得分 50
用GetKeyState()吧,可以检测所有键的状态
SHORT GetKeyState(
int nVirtKey // virtual-key code
);
If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. A key, such as the caps lock key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
另外,可以参考 GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState, and MapVirtualKey
详细情况查MSDN,注意这个函数区分左右Control,Alt,and Shift.
!!!
不妨这样做:
PreTranslate中捕获 0 键按下消息,这时使用GetKeyState(), 检测VK_RCTRL and VK_LCTRL,如下:
BOOL CMyDialog::PreTranslateMessage(MSG * pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
switch(pMsg->wParam)
{
case VK_0:
if(GetKeyState(Control keys) is down)
{
// Handle here
}
return TRUE; //end the message routing
default: break;
}
break;
// TO Handle more messages here.
// case WM_xxx: break;
default: break;
}
// default handle of Dialog
return CDialog::PreTranslateMessage(pMsg);
}Top
8 楼guoxiao()回复于 2001-03-01 22:35:00 得分 0
hi,wild
hi,danial
我也遇到了同样的问题,也没有关于GetKeyState()的参考资料,请问它的返回值是什么?
在我使用的参考书上判断Ctrl键是否按下时使用了如下一句:
if(GetKeyState(VK_CONTROL)&0x8000)
{
if(nChar==.....)
............
}
我不太明白是什么意思,请赐教!
Top
9 楼guoxiao()回复于 2001-03-01 22:50:00 得分 0
我使用的详细代码如下:
void NewDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(GetKeyState(VK_CONTROL))
{
if(nChar==0x58) //Ctrl+X
OnEditCut();
if(nChar==0x56) //Ctrl+V
OnEditPaste();
if(nChar==0x43) //Ctrl+C
OnEditCopy();
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}Top
10 楼skt985(傻问天)回复于 2001-06-01 09:42:00 得分 0
71734关注!Top




