今天在编写一个应用程序时,需要调用系统的屏幕虚拟键盘,没想到这么简单的调用竟然出现问题,报“无法启动屏幕键盘“错误。试了各种调用方 法: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模拟。使用方法如下:
- PVOID OldValue;
- BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
- ShellExecute(this->GetSafeHwnd(),_T("open"),_T("osk.exe"),_T(""),_T(""),SW_SHOW);
- if (bRet) {
- Wow64RevertWow64FsRedirection(OldValue);
- }
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