您的位置:首页 > 编程语言 > C语言/C++

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

2017-05-22 14:39 741 查看
用下面代码在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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐