8435|20

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

有关keybd_event模拟键盘输入问题 [复制链接]

我自己裁剪的平台是ARM+wince4.2
想利用keybd_event模拟键盘输入,可是在我打开的记事本或其他可以输入字符界面,为什么没有我模拟的键盘显示呢?而通过系统自带的软件盘,却能在那些可输入字符的界面输入字符信息。
也就是想问,keybd_event函数的处理函数在哪里?

最新回复

这两个写法都是对的  详情 回复 发表于 2008-6-13 14:48
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  1. int virtualKey;
  2.                                 virtualKey = 'A';       
  3.                                 ::keybd_event(virtualKey, MapVirtualKey(virtualKey, 2), 0, 0);
复制代码


我在ce5 模拟器,vc++2005上测试没有任何问题。
输入为'a'
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
首先谢谢lenux,我不是说这个函数本生有什么问题,用这个函数,模拟delete,right,up,left,enter这些键都可以,可是数字与字母就没有反应,应该是内核或者那里处理KEY_UP的函数过滤了,我就是不知道是那里处理,主要是这个问题。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
"数字与字母没有反应",你首先要确保是不是你自己代码的问题, 其次才是系统的问题,如果不是你对系统的驱动修改太多的。

不要把问题提高到一个你无法解决的高度。

我随便build了一个模拟器就很正常。

贴出你的代码给我们看一眼吧。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果你没修改过驱动,而用系统自带的键盘又能成功输入,那么肯定是你的应用程序问题。
没有代码无法判断。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
                        case WM_KEYDOWN:
                        case WM_KEYUP:
                        case WM_SYSKEYUP:
                        case WM_SYSKEYDOWN:
                        if (recv (Sock, (char *)&MouseData, sizeof(USHORT), 0) == sizeof(USHORT)) {
                                        dwFlags = ((WM_KEYUP == Cmd) || (WM_SYSKEYUP == Cmd)) ? KEYEVENTF_KEYUP : 0;
                                        // No scancode data.
                        RETAILMSG(1,(TEXT("%x,dwFlags=%d\r\n"),MouseData[0],dwFlags));
                        keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
肯定不是代码问题,我是通过远程桌面调试的,也就是说,通过PC键盘,网络发送的键盘信息,RETAILMSG函数打印了输入的键盘信息,也就是说,到这里我都能跟踪键盘信息,调用keybd_event后,就不知道到哪里跟踪了
打印信息表示,我上面说的哪些键值,在记事本输入界面,都有反应,可是其他键值就没有反应,不知道到哪里去跟踪keybd_event了
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
                        case WM_KEYDOWN:
                        case WM_KEYUP:
                        case WM_SYSKEYUP:
                        case WM_SYSKEYDOWN:
                        if (recv (Sock, (char *)&MouseData, sizeof(USHORT), 0) == sizeof(USHORT)) {
                                        dwFlags = ((WM_KEYUP == Cmd) || (WM_SYSKEYUP == Cmd)) ? KEYEVENTF_KEYUP : 0;
                                        // No scancode data.
                        RETAILMSG(1,(TEXT("%x,dwFlags=%d\r\n"),MouseData[0],dwFlags));
                        keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
肯定不是代码问题,我是通过远程桌面调试的,也就是说,通过PC键盘,网络发送的键盘信息,RETAILMSG函数打印了输入的键盘信息,也就是说,到这里我都能跟踪键盘信息,调用keybd_event后,就不知道到哪里跟踪了
打印信息表示,我上面说的哪些键值,在记事本输入界面,都有反应,可是其他键值就没有反应,不知道到哪里去跟踪keybd_event了
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
                        RETAILMSG(1,(TEXT("%x,dwFlags=%d\r\n"),MouseData[0],dwFlags));
                        keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
肯定不是代码问题,我是通过远程桌面调试的,也就是说,通过PC键盘,网络发送的键盘信息,RETAILMSG函数打印了输入的键盘信息,也就是说,到这里我都能跟踪键盘信息,调用keybd_event后,就不知道到哪里跟踪了
打印信息表示,我上面说的哪些键值,在记事本输入界面,都有反应,可是其他键值就没有反应,不知道到哪里去跟踪keybd_event了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
绝对是代码的问题,我用了这个函数没问题
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
是不是你的模拟键盘获得了焦点, 所以导致event没有发送到目标wnd上去.

一个输入法不是简简单单的一个对话框能搞定的...
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

11
 
keybd_event在没有打开软键盘的情况下也能正常工作的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用楼主 sunenyuan 的帖子:
我自己裁剪的平台是ARM+wince4.2
想利用keybd_event模拟键盘输入,可是在我打开的记事本或其他可以输入字符界面,为什么没有我模拟的键盘显示呢?而通过系统自带的软件盘,却能在那些可输入字符的界面输入字符信息。
也就是想问,keybd_event函数的处理函数在哪里?


你模拟的键盘显示?你想做个输入法啊?那可不简单了。如果只是模拟键盘实现字符输入还可能。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
昨天老提示我可能是恶意刷楼,郁闷,今天上来回各位的话
首先,可以肯定不是程序问题
我是在调试系统自带远程桌面调试功能
\WINCE420\PUBLIC\COMMON\OAK\DRIVERS\CERDISP\CERDISP
下面是函数
DWORD
DoInput (LPVOID lpArg)里面的代码
case WM_SYSKEYDOWN:
if (recv (Sock, (char *)&MouseData, sizeof(USHORT), 0) == sizeof(USHORT))
{
dwFlags = ((WM_KEYUP == Cmd) || (WM_SYSKEYUP == Cmd)) ? KEYEVENTF_KEYUP : 0;
                                        // No scancode data.
RETAILMSG(1,(TEXT("%x,dwFlags=%d\r\n"),MouseData[0],dwFlags));
keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
}
break;
非常的简单,而且我也把recv函数收到的键盘信息都打印出来了,到这一步都是对的,可是keybd_event发送就是不生效,这个问题不是应用级的,应该是系统级的,谢谢大家
 
 
 

回复

85

帖子

1

TA的资源

一粒金砂(初级)

14
 
补充说明一下
远程桌面调试功能主要指:
利用PC作为显示终端,利用网络进行数据传输,包括键盘信息,都是来自PC端,如上面代码所示
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 
Emulator中keybd_event不一定有效,特别是在调这个CERDISP sample的时候,因为焦点的频繁切换,有时来不及输入到指定位置,我建议你用WM_SYSCHAR或WM_CHAR试试看。比如输入短信时,最好还是在PC上写,然后一次性发送出去,所以你要扩展一下PC端程序。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

16
 
从打印出来的信息看,没有错,而且,虚拟键值是PC机通过网络发过来的
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 
为什么在ce5中的代码是这样的


  1. case WM_SYSKEYDOWN:
  2.                                 if (recv (Sock, [color=#FF0000](char *)MouseData[/color], sizeof(USHORT), 0) == sizeof(USHORT)) {
  3.                                         dwFlags = ((WM_KEYUP == Cmd) || (WM_SYSKEYUP == Cmd)) ? KEYEVENTF_KEYUP : 0;
  4.                                         // No scancode data.
  5.                                         keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
  6.                                 }
  7.                                 break;
复制代码


MouseData的声明是这样:
USHORT        MouseData[2];

 
 
 

回复

93

帖子

0

TA的资源

一粒金砂(初级)

18
 
一样的阿,那个RetailMsg是我加的调试信息,5.0下面是不是也不对呢?
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

19
 
(char *)MouseData
(char *)&MouseData
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
恩,我也看了,5.0是你发的那样,还是不行
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表