首页
社区
课程
招聘
对话框可不可以扑捉到按键消息??
发表于: 2005-10-12 18:05 8995

对话框可不可以扑捉到按键消息??

2005-10-12 18:05
8995
怎么我在对话框回调函数里检查WM_KEYDOWN没有反映啊,是不是对话框可不可以扑捉到按键消息..

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
捕捉按键消息,一般是在EDIT控件之类相关,如果是SDK方式可以采用子类化技术(SetWindowLong)。
另外,如果对键盘消息有特殊要求的话,可以采用HOOK。

如果一定要在对话框中处理键盘消息,或许可以改变对话框消息队列的某些属性,使之接受键盘消息。。。这一点没试过,仅供参考
2005-10-13 09:58
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我是想做一个象Windows计算器那样的计算器,不管有没有选中EDIT控件,只要一按键盘就可以把数字显示到EDIT里。

我在EDIT控件里采取了子类化技术,排除了0--F以外的按键输入。

现在的问题是,一定要选中EDIT才可以输入,没有选中时按键盘后没有反应,而且对话框根本扑捉不到按键消息。
2005-10-13 22:12
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
你可以分析一下Windows计算器程序.
很明显它使用快捷键资源来解决这个问题.
2005-10-14 10:50
0
雪    币: 431
活跃值: (457)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
5
网上相关的文章很多,这是其中的一个,作者未知。

如何在对话框中响应键盘按键
我们首先想到的是响应WM_KEYDOWN消息,但实际运行却发现没有任何效果。
原因是对话框里的控件需要首先对按键作出响应,比如多行编辑框必须首先
处理回车,不至于回车使对话框关闭。
我们要想在第一时间对对话框的按键做出响应,需要重载PreTranslateMessage,
以下的代码实现了在对话框中显示虚拟键值(virtual-key code)
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
///或者直接调用OnKeyDown
CString strwParam;
strwParam.Format("%d ",pMsg->wParam);
CDC* pDC = GetDC();
pDC->TextOut(10,10,strwParam);
ReleaseDC(pDC);
}
return CDialog::PreTranslateMessage(pMsg);
}

此方法也适用于FORMVIEW或其它控件中对键盘按键的响应,以下的代码来自MSDN,
实现了当按下上下左右方向键时调用OnKeyDown,我们可以在OnKeyDown中作相应处理。

BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg)
{
BOOL bHandleNow = FALSE;
switch (lpmsg->message)
{
case WM_KEYDOWN:
switch (lpmsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
OnKeyDown(lpmsg->wParam, LOWORD(lpmsg ->lParam), HIWORD(lpmsg->lParam));
break;
}
return bHandleNow;
}
2005-10-15 10:44
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
  我后来用的是一个笨办法,就是在每一步操作后都从新设置输入焦点到EDIT里,这样虽然解决了问题,但太麻烦了。
  我现在才发觉函数重载这么厉害,是不是只有C++可以重载啊,用Win32能不能实现对函数重载?
2005-10-18 09:48
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
win32可以直接
在 WinMain 函数的消息循环中 截获消息
2005-10-18 12:40
0
雪    币: 431
活跃值: (457)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
如果对话框里还创建了非模式对话框,那用的你的方法就不好使了,最好还是像rick说的那样――在“消息循环中 截获消息”。
2005-10-19 12:27
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
好象摸态对话框没有消息循环,是由Windows分配消息的吧
2005-10-24 19:50
0
雪    币: 288
活跃值: (112)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
10
sdk 里面模态的对话框是新开了一个线程处理消息循环。
在main里面截不到,

mfc对话框实际上是用的非模态模拟的模态对话框,
可以学学mfc的做法。
2005-10-24 21:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
书上就是这样说的,WIN32可以
2005-10-29 06:53
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
12
怎么有人和我一样需要在对话框里处理按键呢
2005-10-29 10:12
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
13
如果在MFC中可以用CButton::SetButtonStyle 设置属性为 BS_PUSHBUTTON   :
Creates a pushbutton that posts a WM_COMMAND message to the owner window when the user selects the button.
2005-10-29 22:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了,原来是这样
2005-11-1 22:24
0
游客
登录 | 注册 方可回帖
返回
//