本帖最后由 zhaoshan413 于 2017-6-15 16:20 编辑
我的问题如下:我需要响应对话框中的外部按键消息,但是我发现在回调函数中截获WM_KEY消息,得到的结果各不相同,具体实验如下:
STemwin版本:emWin version 5.32
为了避免外部按键驱动可能引起的疑问,我使用的是PC仿真实现实验。
step1:使用GUI_Builder生成一个对话框;
step2:在对话框的回调函数static void _cbDialog(WM_MESSAGE * pMsg) 中增加以下代码:
[mw_shl_code=c,true]
const WM_KEY_INFO* psKey;
...
case WM_KEY:
psKey = (const WM_KEY_INFO*)(pMsg->Data.p);
printf("\r\n> Key = %d, PressedCnt = %d", psKey->Key, psKey->PressedCnt);
break;
...
[/mw_shl_code]
step3:运行,在case WM_KEY中打断点,按下键盘上下箭头,查看断点处psKey ->Key和psKey->PressedCnt的值;
第一个实验:对话框中不放置任何子控件
[mw_shl_code=c,true]
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ WINDOW_CreateIndirect, "Test3", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
// USER START (Optionally insert additional widgets)
// USER END
};[/mw_shl_code]
结果:无法捕捉到断点,也就是未产生WM_KEY...
第二个实验:对话框中只放置一个BUTTON子控件
[mw_shl_code=c,true]
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ WINDOW_CreateIndirect, "Test2", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
{ BUTTON_CreateIndirect, "Button", ID_BUTTON_0, 31, 37, 80, 20, 0, 0x0, 0 },
// USER START (Optionally insert additional widgets)
// USER END
};[/mw_shl_code]
结果:可以捕捉到断点,也就是产生了WM_KEY,此时:
psKey ->Key = 0x00000013
psKey->PressedCnt = 0x00000001
第三个实验:对话框中只放置一个EDIT子控件
[mw_shl_code=c,true]
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
{ WINDOW_CreateIndirect, "Test2", ID_WINDOW_0, 0, 0, 480, 272, 0, 0x0, 0 },
{ EDIT_CreateIndirect, "Edit", ID_EDIT_0, 73, 55, 80, 20, 0, 0x64, 0 },
// USER START (Optionally insert additional widgets)
// USER END
};[/mw_shl_code]
结果:可以捕捉到断点,也就是产生了WM_KEY,此时:
psKey ->Key = 0x00000013
psKey->PressedCnt = 0x00000000
查阅STemWin的参考手册
WM_KEY
Key代表被按下的键值;PressedCnt > 0表示按键被按下,0表示按键被释放
理论上说,无论何种情况,一次按键操作(按下、抬起),我应该先后截获到两次WM_KEY消息才对,为什么会出现以上的结果?
如果我硬件上有一个【返回】键,每一个界面均为一个Dialog,那我如何操作才能在每个Dialog(有可能个别Dialog像第一实验那样,没有子控件,而是在WM_PAINT中自行绘制)中都捕捉并响应到有效的WM_KEY消息(抬起动作)
|