【语言-C++】Win7 64位系统下出现无法启动屏幕键盘的bug
2017-05-22 14:39
741 查看
用下面代码在Win64位系统下调用键盘出现“无法启动屏幕键盘。”的问题。
WinExec("osk.exe",SW_NORMAL);
![](http://img.blog.csdn.net/20170522143238581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmx1NTIwMTMxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
解决方案:
添加头文件和相关函数
#include <Windows.h>
#include <WinBase.h>
typedef BOOL (CALLBACK * pWow64DisableWow64FsRedirection)(PVOID *OldValue);
typedef BOOL (CALLBACK * pWow64RevertWow64FsRedirection) (PVOID OldValue);
pWow64DisableWow64FsRedirection Wow64DisableWow64FsRedirection;
pWow64RevertWow64FsRedirection Wow64RevertWow64FsRedirection;
VOID SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
if (NULL==lpSystemInfo) return;
typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
if (NULL != fnGetNativeSystemInfo)
{
fnGetNativeSystemInfo(lpSystemInfo);
}
else
{
GetSystemInfo(lpSystemInfo);
}
}
int GetSystemBits()
{
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == 9 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
return 64;
}
return 32;
}
添加调用函数
void CDlgSet::OnOsk()
{
// TODO: Add your control notification handler code here
WinExec("osk.exe",SW_NORMAL);
if (GetSystemBits() == 64)
{
HMODULE HMODULE1 = LoadLibrary("Kernel32.dll");
if (HMODULE1 !=NULL)
{
Wow64DisableWow64FsRedirection = (pWow64DisableWow64FsRedirection)GetProcAddress(HMODULE1,"Wow64DisableWow64FsRedirection");
Wow64RevertWow64FsRedirection = (pWow64RevertWow64FsRedirection)GetProcAddress(HMODULE1,"Wow64RevertWow64FsRedirection");
if (Wow64DisableWow64FsRedirection!=NULL && Wow64RevertWow64FsRedirection!=NULL)
{
PVOID OldValue;
BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
WinExec("osk.exe",SW_NORMAL); if (bRet) {
Wow64RevertWow64FsRedirection(OldValue);
}
}
FreeLibrary(HMODULE1);
}
}
else if(32 == GetSystemBits())
{
WinExec("osk.exe",SW_NORMAL);
}
}
WinExec("osk.exe",SW_NORMAL);
解决方案:
添加头文件和相关函数
#include <Windows.h>
#include <WinBase.h>
typedef BOOL (CALLBACK * pWow64DisableWow64FsRedirection)(PVOID *OldValue);
typedef BOOL (CALLBACK * pWow64RevertWow64FsRedirection) (PVOID OldValue);
pWow64DisableWow64FsRedirection Wow64DisableWow64FsRedirection;
pWow64RevertWow64FsRedirection Wow64RevertWow64FsRedirection;
VOID SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
if (NULL==lpSystemInfo) return;
typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
if (NULL != fnGetNativeSystemInfo)
{
fnGetNativeSystemInfo(lpSystemInfo);
}
else
{
GetSystemInfo(lpSystemInfo);
}
}
int GetSystemBits()
{
SYSTEM_INFO si;
SafeGetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == 9 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
return 64;
}
return 32;
}
添加调用函数
void CDlgSet::OnOsk()
{
// TODO: Add your control notification handler code here
WinExec("osk.exe",SW_NORMAL);
if (GetSystemBits() == 64)
{
HMODULE HMODULE1 = LoadLibrary("Kernel32.dll");
if (HMODULE1 !=NULL)
{
Wow64DisableWow64FsRedirection = (pWow64DisableWow64FsRedirection)GetProcAddress(HMODULE1,"Wow64DisableWow64FsRedirection");
Wow64RevertWow64FsRedirection = (pWow64RevertWow64FsRedirection)GetProcAddress(HMODULE1,"Wow64RevertWow64FsRedirection");
if (Wow64DisableWow64FsRedirection!=NULL && Wow64RevertWow64FsRedirection!=NULL)
{
PVOID OldValue;
BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
WinExec("osk.exe",SW_NORMAL); if (bRet) {
Wow64RevertWow64FsRedirection(OldValue);
}
}
FreeLibrary(HMODULE1);
}
}
else if(32 == GetSystemBits())
{
WinExec("osk.exe",SW_NORMAL);
}
}
相关文章推荐
- Matlab 打不开 无法运行 win10 系统 卡在启动界面没有反应 语言bug
- 关于win7 64位系统安装apache的 教程 httpd2.4服务无法启动 443端口被占用问题
- win7 64位系统下 vs2013无法创建c++项目
- mpich2在win7的64位运行出现的问题C/C++语言
- msswch.dll丢失怎么办?解决win7无法启动屏幕键盘的办法
- 双系统(win7+ubuntu)中重装Ubuntu覆盖先前Ubuntu时出现win7无法启动?
- winpcap/wireshark在win7 64位系统下IP头部结构长度为0的bug
- 无法访问WIN7 64位系统下的Oracle 11.2.0.1的解决办法
- Win7登录时,登录Administrator,出现 Group policy client 未启动,无法登陆
- win7 64位系统使用VS2010生成时出现中文目录乱码问题的解决方法
- 【转】WIN7 64位系统 IIS7.5 下:HTTP 错误 404.17 - Not Found 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 解决方法
- linux(RedHat)启动无法进入图形界面,出现灰色屏幕。
- win7旗舰系统安装,光标左上角一直闪动,一直无法进入系统启动!
- WIN7 激活失败 报 A20 debug C806 done... 错误,系统无法启动的解决办法。
- pe模式安装win7(32位)的时候出现“安装程序无法定位现有系统分区,也无法创建新的系统分区”提示,网上很多对此问题没有很好的解决办法
- Cocos2d-x--新建Cocos2d-x项目出现的问题--系统无法启动程序,系统找不到指定的路径
- VMware USB Arbitration Service无法启动,出现错误31:连接到系统上的设备没有发挥作用”
- win7屏幕小键盘的bug
- Bug:无法启动程序 系统找不到指定的文件
- 无法启动屏幕键盘