【语言-C++】Win7 64位系统下出现无法启动屏幕键盘的bug

用下面代码在Win64位系统下调用键盘出现“无法启动屏幕键盘。”的问题。

	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);	
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值