Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682837
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: Windows平台

2013-04-22 15:56:30

今天在编写一个应用程序时,需要调用系统的屏幕虚拟键盘,没想到这么简单的调用竟然出现问题,报“无法启动屏幕键盘“错误。试了各种调用方 法:ShellExcute、CreateProcess、WinExec、system等方法都不能成功调用。但是奇怪的是在命令行或者程序->运行 中调用却又是正常的。逼的没办法,想到先将C:\Windows\System32\osk.exe程序拷贝到当前目录下再运行程序,没想到调用成功。

下面先交待一下本人的工作环境:
win7 64位系统,编译win32程序,在win32程序中调用系统的屏幕键盘。

本以为这样就算没事了,没想到把程序放到32位系统中调用又出现问题了。最后向google大神求救。终于在msdn论坛上找到答案:
64位系统上是不允许调用直接调用32位的应用程序的,如果调用系统会帮你把32位程序模拟成64位程序。

针对此问题有两种解决方法:
1)提供32位版本的执行文件,如将XP 32位下的osk.exe拷贝到工程文件中。
2)通过Wow64DisableWow64FsRedirection函数调用判断和关闭Wow模拟。使用方法如下:


  1. PVOID OldValue;  
  2. BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);  
  3.   
  4. ShellExecute(this->GetSafeHwnd(),_T("open"),_T("osk.exe"),_T(""),_T(""),SW_SHOW);  
  5.   
  6. if (bRet) {   
  7.      Wow64RevertWow64FsRedirection(OldValue);   
  8. }  

Wow64DisableWow64FsRedirection功能是关闭wow模拟功能和得到当前的状态。 Wow64RevertWow64FsRedirection 用于恢复状态。

参考文献:

【1】Error when opening On-Screen keyboard in windows 7 - "Could not start On-Screen keyboard"[OL].

【2】应对32位程序在64位系统上访问注册表和文件自动转向问题[OL]. http://www.cnblogs.com/FlyingBread/archive/2007/01/21/624291.html

阅读(2839) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~