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

来源:互联网 发布:美国仓库淘宝网 编辑:程序博客网 时间:2024/06/09 21:28

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


阅读全文
0 0
原创粉丝点击