emWin(ucgui) 在PC端的模拟器,默认的按键机制是"按抬都Msg",当在按下键盘时,会收到一个key值-1,在按键没有离开时一直维持,当按键松开时还发送一个key值-0的标记。所以在你手速多快的情况下都会有一个 key,1和key,0两个操作。程序中没有对按键的状态做判定,所以在PC上不管是按下,还是按下后离开都会进行响应(两次响应)。

 

假设有以下的应用场景,一级菜单->(ENTER键)->二级菜单>(ENTER键)->三级菜单,即,在一级菜单是可以用ENTER键进入二级菜单,同样在二级菜单可以用ENTER键进入三级菜单,实现的方式是:响应ENTER键的消息,然后切换菜单。

/*******************************************************************************

* Function Name :WIN_Enter

* Description :进入下一级窗口

* Input :int id:把进入的ID号

* Output :void

* Other :

* Date :2013/06/02

*******************************************************************************/

int
WIN_Enter(int
id)

{

ELEM_BLOCK_TYPE *pElem;

MENU_INFO_ITEM *pInfo;

MENU_INFO_ITEM *pCur; //当前的窗口

WIN_ContextLock();

if (m_WinList.index < 1) //窗口调度没有初始化

goto
ext;

if (m_WinList.index >= WIN_LEVEL_LAYER_COUNT - 1)//窗口深度超出最大范围

goto
ext;

pElem = &m_WinList.elem[m_WinList.index - 1]; //获得当前窗口

pCur = pInfo = pElem->menu;

pInfo = BT_GetRightChild(pInfo); //获取下级窗口

pInfo = BT_GetLChildElem(pInfo, *(int *)id);

if (pInfo == NULL) //无下级窗口

goto
ext;

if (pInfo->data == NULL) //下级窗口元素为空

goto
ext;

pElem->ret.id = *(int *)id; //保存所进入的ID

if (pInfo->data->win == NULL) //下级窗口无窗口数据

goto
end;

if (pCur->data->win->destroy) //销毁当前窗口

(*pCur->data->win->destroy)(NULL);

if (pInfo->data->win->create) //新窗口建立

(*pInfo->data->win->create)(pInfo);

m_WinList.elem[m_WinList.index++].menu = pInfo; //保存新窗口到窗口列表中

end:

WIN_ContextUnlock();

if (pInfo->data->enter) {

(*pInfo->data->enter)(&id);

}

return
OK;

ext:

WIN_ContextUnlock();

return
FALSE;

}

 

 

以上代码是通过提前构造少的菜单树结构,然后在菜单节点响应ENTER键和ESC键完成进入和退出,从代码上看不出有什么问题了,但是在PC实际仿真的过程成发现,在一级菜单按下ENTER键时进入二级菜单,紧接着进入三级菜单。

 

 

 

所有需要对ENTER键进行判断响应,每次按下ENTER键就响应一次:

case
WM_KEY:

        switch (((WM_KEY_INFO *)(pMsg->Data.p))->Key){

            case
GUI_KEY_ENTER:

             if(((WM_KEY_INFO *)(pMsg->Data.p))->PressedCnt == 0)

                 WIN_Enter(0);

             break;

        }

     break;

emWin(ucGUI)在PC机上模拟的按键响应多次解决办法 worldsing的更多相关文章

  1. SQLServer 安装以前的某个程序安装已在安装计算机上创建挂起的文件操作 解决办法

    http://wenku.baidu.com/view/6732fe09844769eae009ede2.html SQL Server 安装以前的某个程序安装已在安装计算机上创建挂起的文件操作 安装 ...

  2. 未在本地计算机上注册microsoft.ace.12.0的解决办法

    (1)去http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabase ...

  3. fiddler抓取手机上https数据配置和失败的解决办法

    1. 设置fiddler,Tools-Options...      抓取https的话,勾选红框中的内容 2. fiddler默认监听端口8888 3. 查看本机IP 4. 打开手机 设置-无线局域 ...

  4. 在PC机上,如何用Chrome浏览器模拟查看和调试手机的HTML5页面?

    如题,如何用PC机上的Chrome浏览器模拟查看和调试手机HTML5页面? 参考操作步骤如下: 第一步.用Chrome打开要调试的页面: 第二步.按F12,打开“开发者工具”,点击其右上角的“Dock ...

  5. emWin(ucGui) Edit控件数值模式 ——符号编辑 worldsing

    emWin(ucGui) Edit控件数值模式出现负数值编辑时,如果键盘按键全可以设置独立的"-","+"键,这样可以正常编辑正数和负数,但是要没有设置这两个键 ...

  6. golang实现模拟键盘按键

    公司前段时间要我写个小项目需要可以局域网内一个ipad控制另一台pc上的键盘输入,github上找了找,居然有个robotgo库这么神级的存在,感觉go的库真是越来越多了,虽然大部分都是第三方的.ht ...

  7. Android随笔之——用shell脚本模拟用户按键、触摸操作

    之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...

  8. 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

    本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...

  9. 整理分享C#通过user32.dll模拟物理按键操作的代码

    对系统模拟按键方面的知识和按键映射代码做了一下梳理,在这里分享出来,适用于开发自动操作工具和游戏外挂. 主代码: public const int KEYEVENTF_EXTENDEDKEY = 0x ...

随机推荐

  1. 设置sudo不输入密码 sudoers 编辑出错后的补救方法

    一 设置sudo为不需要密码 有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替.默认新建的用户不在sudo组,需要编辑/etc/sudoers文件 ...

  2. html常用笔记

    <?php //CSS可以对文本格式进行精确的控制 //HTML标记更有利于搜索引擎 //一.标签 <br> <p>//换行后插入一个空行,单字节不换行,双字节自动换行 ...

  3. 【英语】Bingo口语笔记(49) - 春节请客吃饭的表达

  4. 隐藏 php apache 的版本号

    隐藏Apache版本信息 找到apache安装路径,譬如\Apache\conf\httpd.conf 修改httpd.conf ServerTokens ProductOnly ServerSign ...

  5. Java中数组复制的几种方法

    /** * @author zhengbinMac */ public class Test { public static void main(String[] args) { int[] arra ...

  6. ios ViewController 页面跳转

    从一个Controller跳转到另一个Controller时,一般有以下2种: 1.利用UINavigationController,调用pushViewController,进行跳转:这种采用压栈和 ...

  7. PHP校验ISBN码的函数

    国际标准书号(International Standard Book Number,ISBN:拟发音is-ben),是国际通用的图书或独立的出版物(除定期出版的期刊)代码.出版社可以通过国际标准书号清 ...

  8. jQuery Mobile中文手册:开发入门

    jQuery Mobile 以“Write Less, Do More”作为目标,为所有的主流移动操作系统平台提供了高度统一的 UI 框架:jQuery 的移动框架可以让你为所有流行的移动平台设计一个 ...

  9. java 学习资料

    最近一直在从java基础开始学习java,感觉个人学习思路还是比较混乱的. 看到Java工程师成神之路中介绍了需要学习的知识点,并在<成神之路系列文章>中分章分节的开始介绍其中所有的知识点 ...

  10. java PO、BO

    PO(persistent object) 持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,那么这个概念也就不存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数 ...