本人编写了一个屏幕键盘的输入程序,输入英文、汉字等字符没有问题,但无法像Windows提供的软键盘一样可以输入俄文等UNICODE字符。真心请教各位高手。
解决方案 »
- VirtualFreeEx 报错,错误号为87(参数错误)
- 创建MFC DLL项目的自动化与ATL有什么区别吗?//只封装一个绘图类用那个合适?
- 突然发现个问题。。。
- 各位帮个忙! Scrollbar美化
- 求助:VC6中CStatic控件怎么才能解决闪烁的问题啊
- 喜欢图形学,做OpenGL开发的,请加入QQ群23186719
- 如何在程序中创建一个新的表格(Table)?
- 分享windows编程的经验,高手请进
- 概念性的问题:窗口的父子关系和所有、被所有关系的区别?
- 只有请教专家了, edit控件
- Help!如何把一个DLL编译成Unicode?
- 英文2000系统为什么显示unicode编写的软件时 全是方框,我已经安装中文字符,但区域选择的是english(US),请高手指教
эю ===== 0xA7EF 0xA7F0
开发环境: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函数会失败,我到目前还不清楚。如果哪位高手知道,请告知,在下感激不尽。同时也希望我的这点心得会给大家带来一些启发!