用下面代码在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);
}
}