最近项目用到了MiniGui,界面比较简单就是一个主窗口,窗口两边是独立的功能键。点击功能键会调用对话框,有几层就调用几次对话框。
结束或取消操作时,返回到主窗口。问题是当我从多层对话框直接跳转到主窗口后,屏幕的按键失效了。
我在主窗口中多次调用对话框,对话框在调用对话框。然后直接退回到主窗口后,主窗口循环正常,但是不响应键盘按键了。
对话框中调用 (创建对话框 DialogBoxIndirectParam )
SendNotifyMessage(hwnd_second_dlg, MSG_CLOSE, wParam, lParam);
用来关闭主窗口的下级对话框
case MSG_CLOSE:
DestroyAllControls(hDlg);
DestroyMainWindow(hDlg);
MainWindowCleanup(hDlg);
可以成功关闭主窗口中打开的所有对话框
执行后主窗口的边键(对应键盘 F1 - F8) 失效。
在MiniGui的源代码中增加了打印信息,跟踪运行情况。
BOOL IdleHandler4Server (PMSGQUEUE msg_queue) 【server.c】
-负责读取client端消息和键盘按键动作的消息,循环执行。
static void ParseEvent (PMSGQUEUE msg_que, int event)【server.c】
-按键操作处理函数,当然还可以处理鼠标的消息。
mginit调用int __mg_send2client (MSG* msg, MG_Client* client) 【client.c】发送按键消息到Client端。
发现返回主界面后就不调用__mg_send2client 。那么继续跟踪在什么地方调用__mg_send2client 发送的消息。
static int srvKeyMessageHandler (int message, int scancode, DWORD status)【desktop-procs.c】
if (__mg_zorder_info->active_win) {
__mg_post_msg_by_znode (__mg_zorder_info,
__mg_zorder_info->active_win,
MSG_CLOSE, 0, 0);
return 0;
}
如果__mg_zorder_info->active_win为0,mginit将不发送按键消息给Client端。
找到原因就好办了,去MiniGui中查找函数SetActiveWindow(hwnd);
把函数加到主窗口的MSG_PAINT消息中执行,边键果然好使了!