我自己裁剪的平台是ARM+wince4.2
想利用keybd_event模拟键盘输入,可是在我打开的记事本或其他可以输入字符界面,为什么没有我模拟的键盘显示呢?而通过系统自带的软件盘,却能在那些可输入字符的界面输入字符信息。
也就是想问,keybd_event函数的处理函数在哪里?
- int virtualKey;
- virtualKey = 'A';
- ::keybd_event(virtualKey, MapVirtualKey(virtualKey, 2), 0, 0);
我在ce5 模拟器,vc++2005上测试没有任何问题。
输入为'a'
首先谢谢lenux,我不是说这个函数本生有什么问题,用这个函数,模拟delete,right,up,left,enter这些键都可以,可是数字与字母就没有反应,应该是内核或者那里处理KEY_UP的函数过滤了,我就是不知道是那里处理,主要是这个问题。
"数字与字母没有反应",你首先要确保是不是你自己代码的问题, 其次才是系统的问题,如果不是你对系统的驱动修改太多的。
不要把问题提高到一个你无法解决的高度。
我随便build了一个模拟器就很正常。
贴出你的代码给我们看一眼吧。
如果你没修改过驱动,而用系统自带的键盘又能成功输入,那么肯定是你的应用程序问题。
没有代码无法判断。
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了
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了
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了
是不是你的模拟键盘获得了焦点, 所以导致event没有发送到目标wnd上去.
一个输入法不是简简单单的一个对话框能搞定的...
keybd_event在没有打开软键盘的情况下也能正常工作的。
引用: 引用楼主 sunenyuan 的帖子:
我自己裁剪的平台是ARM+wince4.2
想利用keybd_event模拟键盘输入,可是在我打开的记事本或其他可以输入字符界面,为什么没有我模拟的键盘显示呢?而通过系统自带的软件盘,却能在那些可输入字符的界面输入字符信息。
也就是想问,keybd_event函数的处理函数在哪里?
你模拟的键盘显示?你想做个输入法啊?那可不简单了。如果只是模拟键盘实现字符输入还可能。
昨天老提示我可能是恶意刷楼,郁闷,今天上来回各位的话
首先,可以肯定不是程序问题
我是在调试系统自带远程桌面调试功能
\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发送就是不生效,这个问题不是应用级的,应该是系统级的,谢谢大家
补充说明一下
远程桌面调试功能主要指:
利用PC作为显示终端,利用网络进行数据传输,包括键盘信息,都是来自PC端,如上面代码所示
Emulator中keybd_event不一定有效,特别是在调这个CERDISP sample的时候,因为焦点的频繁切换,有时来不及输入到指定位置,我建议你用WM_SYSCHAR或WM_CHAR试试看。比如输入短信时,最好还是在PC上写,然后一次性发送出去,所以你要扩展一下PC端程序。
从打印出来的信息看,没有错,而且,虚拟键值是PC机通过网络发过来的
为什么在ce5中的代码是这样的
- case WM_SYSKEYDOWN:
- if (recv (Sock, [color=#FF0000](char *)MouseData[/color], sizeof(USHORT), 0) == sizeof(USHORT)) {
- dwFlags = ((WM_KEYUP == Cmd) || (WM_SYSKEYUP == Cmd)) ? KEYEVENTF_KEYUP : 0;
- // No scancode data.
- keybd_event ((BYTE)MouseData[0], 0, dwFlags, 0);
- }
- break;
MouseData的声明是这样:
USHORT MouseData[2];
一样的阿,那个RetailMsg是我加的调试信息,5.0下面是不是也不对呢?
(char *)MouseData
(char *)&MouseData