无法启动屏幕键盘

今天在编写一个应用程序时,需要调用系统的屏幕虚拟键盘,没想到这么简单的调用竟然出现问题,报“无法启动屏幕键盘“错误。试了各种调用方法: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]. http://social.msdn.microsoft.com/Forums/en-GB/vbgeneral/thread/e9252bb7-1df0-4826-880f-ad0a636a18cd

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


你可能感兴趣的:(windows,工作,Google,XP,System,keyboard)