可以通过以下代码打开Windows虚拟键盘
void UMouseSimulatorBPLibrary::ShowVirtualKeyboard()
{
  TCHAR* OskPath = L"C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe";
  if (!FPaths::FileExists(OskPath))
  {
    OskPath = L"C:\\windows\\system32\\osk.exe";
  }
  GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, OskPath);
  if (!FPaths::FileExists(OskPath)) {
    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("没有找到虚拟键盘路径"));
  }
  else {
    FProcHandle ProcHandle = FPlatformProcess::CreateProc(OskPath, L"", true, false, false, nullptr, -1, nullptr, nullptr);
    if (!ProcHandle.IsValid())
    {
      // 处理错误
      DWORD err = GetLastError();
      FString errMsg = FString::Printf(TEXT("FPlatformProcess::CreateProc Fail, Error code: %d"), err);
      GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, errMsg);
      // 尝试用ShellExecuteEx替身权限打开
      SHELLEXECUTEINFO ShExecInfo = { 0 };
      ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
      ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
      ShExecInfo.hwnd = NULL;
      ShExecInfo.lpVerb = TEXT("runas"); // 请求提升权限
      ShExecInfo.lpFile = OskPath; // 可执行文件路径
      ShExecInfo.lpParameters = TEXT(""); // 参数
      ShExecInfo.lpDirectory = NULL;
      ShExecInfo.nShow = SW_NORMAL;
      ShExecInfo.hInstApp = NULL;
      bool bSuccess = ShellExecuteEx(&ShExecInfo);
      if (!bSuccess)
      {
        // 处理错误
        err = GetLastError();
        errMsg = FString::Printf(TEXT("ShellExecuteEx Fail, Error code: %d"), err);
        GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, errMsg);
      }
    }
  }
}
 
其中:TabTip.exe是带中文输入的,osk.exe只能输入英文。
通常,FPlatformProcess::CreateProc在Window 10以上系统是无法执行外部exe的。调试信息返回GetLastError() = 740。
 
 这是一个权限不足的问题。chatGPT建议用ShellExecuteEx来提升权限运行。
 用runas提升权限提示后,系统弹出以下安全确认对话框
 
 可以在控制面板中修改通知权限,避免每次都要权限确认。
 



















