本人编写了一个屏幕键盘的输入程序,输入英文、汉字等字符没有问题,但无法像Windows提供的软键盘一样可以输入俄文等UNICODE字符。真心请教各位高手。

解决方案 »

  1.   

    他们都有自己的16进制编码,字符编码,得到他们的编码就可以了如饿语
    эю   ===== 0xA7EF   0xA7F0
      

  2.   

    我已经解决了这个问题了,现在拿出来和大家一起分享!如果有问题请指正。
        开发环境:WindowsXP,VC6.0
        问题:调用VkKeyScan函数来获取字符所对应的Virtual-Key,输入法为英文、或者其它的汉字输入法时,均可获取正确的扫描码,比如:调用VkKeyScan('a'),则返回65。但在俄文输入法方式下,该函数的返回值却是-1,也就是说,无法获取正确的Virtual-Key!
        原来有问题的代码如下,以字符'a'作为例子:
        TCHAR cChar = 'a';
        SHORT ks = VkKeyScan(cChar);//英文输入法下,ks的值为65,俄文输入法下为-1(意味着调用VkKeyScan失败)
        BYTE key = ks & 0xFF;
        keybd_event(key, 0, 0, 0);
        keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
        unsigned char vk = VK_SHIFT;
        if(GetKeyState(vk) & 0xF000)
        {
           keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);
        }
        vk = VK_CONTROL;
        if(GetKeyState(vk) & 0xF000)
        {
           keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);
         }    我现在作了如下处理,俄文得以正确的输入,修改后的代码如下:
        TCHAR cChar = 'a';
        SHORT ks = 65;
        BYTE key = ks & 0xFF;
        keybd_event(key, 0, 0, 0);
        keybd_event(key, 0, KEYEVENTF_KEYUP, 0);
        unsigned char vk = VK_SHIFT;
        if(GetKeyState(vk) & 0xF000)
        {
           keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);
        }
        vk = VK_CONTROL;
        if(GetKeyState(vk) & 0xF000)
        {
           keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);
         }
         看到这里大家应该都知道了我的处理方法:不管在何种的输入方式下,我不再去调用VkKeyScan这个函数,而是把字符所对应的Virtual-key直接拿过来用!这样的处理方法看起来未免有点傻,但是msdn中同样有说明,目前的Win32系统中的Virtual-key基本上已经定义好而且是唯一的,所以,没有理由不拿来用。而且幸庆的是,目前一般键盘不过100来个键,工作量不算大,参照msdn中提供的Virtual-key codes对照表,定义好每一个字符键(或者功能键)的Virtual-key的值,如上所写的代码,就可以完成对Unicode字符的输入而不再去管他在何中输入法方式下。
        至于在俄文方式下为何调用VkKeyScan函数会失败,我到目前还不清楚。如果哪位高手知道,请告知,在下感激不尽。同时也希望我的这点心得会给大家带来一些启发!