硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4143|回复: 6
收起左侧

[emWin] GUI_SendKeyMsg()这函数怎么用

[复制链接]

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
发表于 2016-10-18 16:57:42 | 显示全部楼层 |阅读模式
如题,在看官方的NUMPAD例程时,看到用这个函数来发送数值到EDIT进行显示。
这个函数的参数只有key和pressed,并没有窗口的句柄。
看文档上说,Sends a key message to the window with the input focus
是指被设置为输入焦点的那个窗口?在emwin中,同一时刻只会有一个窗口被设置成焦点?

还有,文档上说这个函数不能在中断服务程序中被调用,是指什么呢?是阻塞的还是说执行时间可能会很长?

这个函数参数中的Pressed有什么具体的用处吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-10-19 01:05:20 | 显示全部楼层
1. 键盘消息只能发给聚焦的窗口,同一个时候只有一个控件是聚焦的,电脑上也是一样的。

2. 按照他说的不在中断服务程序调用即可。

3. 键盘按下计数,比如你只发送键盘按下消息,却没有发送释放消息。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2016-10-19 08:42:07 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 键盘消息只能发给聚焦的窗口,同一个时候只有几个控件是聚焦的,电脑上也是一样的。

2. 按照他说的不在中断服务程序调用即可。

3. 键盘按下计数,比如你只发送键盘按下消息,却没有发送释放消息。 (2016-10-19 01:05) 
1.同一时刻,会有几个控件同时被聚焦?
  那也应该是在一个页面内只有一个被聚焦的控件吧。
  只是可以允许每个页面都有一个被聚焦的?
那发送键值的话,不就要乱了么

2.发送键值给EDIT的话,Pressed参数为1时,EDIT能显示,为0时没有显示。
  要想在EDIT中显示一个数字的话,只要将Pressed设置为1,发送一次就行。
发送多次时会显示多个
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-10-19 09:38:29 | 显示全部楼层

回 jplzl10000 的帖子

jplzl10000:1.同一时刻,会有几个控件同时被聚焦?
  那也应该是在一个页面内只有一个被聚焦的控件吧。
  只是可以允许每个页面都有一个被聚焦的?
那发送键值的话,不就要乱了么
....... (2016-10-19 08:42) 
同一个时候只有一个,写错了,已经修改过来了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-10-19 09:41:41 | 显示全部楼层

回 jplzl10000 的帖子

jplzl10000:1.同一时刻,会有几个控件同时被聚焦?
  那也应该是在一个页面内只有一个被聚焦的控件吧。
  只是可以允许每个页面都有一个被聚焦的?
那发送键值的话,不就要乱了么
....... (2016-10-19 08:42)
Pressed > 0是表示按下计数,确切的说是PressedCnt
Pressed  = 0 是表示释放

像我们的做的例子实体按键操作的例子,都是仅发 > 0 ,没有做释放处理,测试也没啥问题。后面还要专门测试下。
回复

使用道具 举报

270

主题

605

回帖

1415

积分

至尊会员

积分
1415
 楼主| 发表于 2016-10-19 11:56:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:1. 键盘消息只能发给聚焦的窗口,同一个时候只有一个控件是聚焦的,电脑上也是一样的。

2. 按照他说的不在中断服务程序调用即可。

3. 键盘按下计数,比如你只发送键盘按下消息,却没有发送释放消息。
....... (2016-10-19 01:05) 
2.刚试了一下,在system_tick的20ms中断里面用GUI_SendKeyMsg()直接发送,没出现问题。
不知道文档上说的不能在中断里面执行,是不是包括这种中断服务程序呢。

在一些应用中,肯定有些页面用GUI_ExecDialogBox()这种阻塞式创建的话,更显得逻辑通顺。
就是必须得在这个页面里面完成操作才能退出这个页面。而且在退出页面前都不能有其他的硬件操作。那这样的话,如果不在硬件的中断服务程序中使用GUI_SendKeyMsg()的话,那岂不是很不方便
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-10-19 12:10:25 | 显示全部楼层

回 jplzl10000 的帖子

jplzl10000:2.刚试了一下,在system_tick的20ms中断里面用GUI_SendKeyMsg()直接发送,没出现问题。
不知道文档上说的不能在中断里面执行,是不是包括这种中断服务程序呢。

在一些应用中,肯定有些页面用GUI_ExecDialogBox()这种阻塞式创建的话,更显得逻辑通顺。
....... (2016-10-19 11:56) 
1.  首先要明白一点,这个函数GUI_SendKeyMsg是专用于发送键盘消息,或者类似键盘的外部输入设备。多任务设计的时候这个函数都是在键盘任务里面直接调用。是不是阻塞窗口无所谓。

2. 即然说到这个函数的中断调用问题了,我就再多说下。

官方这么说是因为在多任务设计的情况,这个函数GUI_SendKeyMsg()会触发底层的API,主要是RTOS的api函数,RTOS中的部分函数是不可以在中断里面调用,特别是OSXXXXPend挂起类函数。
官方这么说的意义就在这里了。

对于这个问题,我们暂时就讨论这么多吧,剩下你再研究研究。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-18 06:59 , Processed in 0.086415 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表