有关keybd_event模拟键盘输入问题

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

回复评论 (20)

  1. int virtualKey;
  2.                                 virtualKey = 'A';       
  3.                                 ::keybd_event(virtualKey, MapVirtualKey(virtualKey, 2), 0, 0);


我在ce5 模拟器,vc++2005上测试没有任何问题。
输入为'a'
点赞  2008-6-12 13:23
首先谢谢lenux,我不是说这个函数本生有什么问题,用这个函数,模拟delete,right,up,left,enter这些键都可以,可是数字与字母就没有反应,应该是内核或者那里处理KEY_UP的函数过滤了,我就是不知道是那里处理,主要是这个问题。
点赞  2008-6-12 14:36
"数字与字母没有反应",你首先要确保是不是你自己代码的问题, 其次才是系统的问题,如果不是你对系统的驱动修改太多的。

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

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

贴出你的代码给我们看一眼吧。
点赞  2008-6-12 14:53
如果你没修改过驱动,而用系统自带的键盘又能成功输入,那么肯定是你的应用程序问题。
没有代码无法判断。
点赞  2008-6-12 15:01
                        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了
点赞  2008-6-12 15:39
                        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了
点赞  2008-6-12 15:40
                        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了
点赞  2008-6-12 15:40
绝对是代码的问题,我用了这个函数没问题
点赞  2008-6-12 17:05
是不是你的模拟键盘获得了焦点, 所以导致event没有发送到目标wnd上去.

一个输入法不是简简单单的一个对话框能搞定的...
点赞  2008-6-12 17:16
keybd_event在没有打开软键盘的情况下也能正常工作的。
点赞  2008-6-12 17:31
引用: 引用楼主 sunenyuan 的帖子:
我自己裁剪的平台是ARM+wince4.2
想利用keybd_event模拟键盘输入,可是在我打开的记事本或其他可以输入字符界面,为什么没有我模拟的键盘显示呢?而通过系统自带的软件盘,却能在那些可输入字符的界面输入字符信息。
也就是想问,keybd_event函数的处理函数在哪里?


你模拟的键盘显示?你想做个输入法啊?那可不简单了。如果只是模拟键盘实现字符输入还可能。
点赞  2008-6-12 21:54
昨天老提示我可能是恶意刷楼,郁闷,今天上来回各位的话
首先,可以肯定不是程序问题
我是在调试系统自带远程桌面调试功能
\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发送就是不生效,这个问题不是应用级的,应该是系统级的,谢谢大家
点赞  2008-6-13 09:43
补充说明一下
远程桌面调试功能主要指:
利用PC作为显示终端,利用网络进行数据传输,包括键盘信息,都是来自PC端,如上面代码所示
点赞  2008-6-13 09:50
Emulator中keybd_event不一定有效,特别是在调这个CERDISP sample的时候,因为焦点的频繁切换,有时来不及输入到指定位置,我建议你用WM_SYSCHAR或WM_CHAR试试看。比如输入短信时,最好还是在PC上写,然后一次性发送出去,所以你要扩展一下PC端程序。
点赞  2008-6-13 10:24
从打印出来的信息看,没有错,而且,虚拟键值是PC机通过网络发过来的
点赞  2008-6-13 10:28
为什么在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];

点赞  2008-6-13 11:32
一样的阿,那个RetailMsg是我加的调试信息,5.0下面是不是也不对呢?
点赞  2008-6-13 14:05
(char *)MouseData
(char *)&MouseData
点赞  2008-6-13 14:19
恩,我也看了,5.0是你发的那样,还是不行
点赞  2008-6-13 14:47
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复