C# 在同一个CPU应用程序中使用Awesomium(x86)和OSK(x64)

C# 在同一个CPU应用程序中使用Awesomium(x86)和OSK(x64),c#,wpf,winapi,windows-10,awesomium,C#,Wpf,Winapi,Windows 10,Awesomium,我正在用Awesomium开发一个wpf应用程序,但同时我想使用OSK(Windows10本机屏幕键盘)。当我简单地运行Process.start(“osk.exe”)时,出现一个错误,提示“无法在屏幕键盘上启动” 如果我删除prefere-32位选项,我可以运行OSK。但我需要冬虫夏草。我该怎么处理 编辑:我已将UseShellExecute设置为true,但结果相同 Process osk = new Process(); osk.StartInfo.UseS

我正在用Awesomium开发一个wpf应用程序,但同时我想使用OSK(Windows10本机屏幕键盘)。当我简单地运行Process.start(“osk.exe”)时,出现一个错误,提示“无法在屏幕键盘上启动”

如果我删除prefere-32位选项,我可以运行OSK。但我需要冬虫夏草。我该怎么处理

编辑:我已将UseShellExecute设置为true,但结果相同

        Process osk = new Process();
        osk.StartInfo.UseShellExecute = true;
        osk.StartInfo.FileName = "osk.exe"; //  path;//  "osk";
        osk.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

OSK是一个非常特殊的过程,因为它可以用于将输入注入其他应用程序,并且是一个潜在的安全弱点。操作系统在其周围设置的安全措施的后果之一是,它不能轻易地由WOW64进程启动。为了解决这个问题,您需要创建一个简单的x64可执行文件来启动OSK。然后从在WOW64下运行的x86进程开始,在需要启动OSK时启动该中间可执行文件。显然,您应该只从WOW64进程执行此操作。如果在32位系统上运行,则不得尝试启动64位可执行文件

请注意,此问题()的答案建议在启动OSK时禁用文件系统重定向。但是,禁用文件系统重定向(即使是在很短的时间内)是一种非常危险的行为,我不建议这样做。虽然启动另一个流程可能看起来很混乱,只是为了让你可以启动另一个流程,但我认为这是解决你问题的最佳方案

这里有一些更有趣的观察结果:。特别有趣的是,
CreateProcess
被阻止启动OSK。它必须由
ShellExecuteEx
完成。或者想必是
ShellExecute
,但正如我文章的普通读者所知道的那样,我之所以避开
ShellExecute
,是因为它的错误处理机制已经失效

我想说,作为旁白,如果您真的必须作为x86进程执行,那么以任何CPU为目标似乎是错误的。您应该以x86为目标


更新

从评论和你的问题编辑中可以清楚地看出,你还没有完全理解这个答案。我会试着把它说清楚一点。您需要以下内容:

  • 一个32位的进程,用于使用一个函数
  • 用于启动OSK的64位进程

  • 这是两个过程。您的主进程是32位进程。当您需要显示OSK时,启动64位进程,该进程将依次启动OSK。64位进程可以在启动OSK后立即终止。

    OSK是一个非常特殊的进程,因为它可以用于将输入注入其他应用程序,并且是一个潜在的安全弱点。操作系统在其周围设置的安全措施的后果之一是,它不能轻易地由WOW64进程启动。为了解决这个问题,您需要创建一个简单的x64可执行文件来启动OSK。然后从在WOW64下运行的x86进程开始,在需要启动OSK时启动该中间可执行文件。显然,您应该只从WOW64进程执行此操作。如果在32位系统上运行,则不得尝试启动64位可执行文件

    请注意,此问题()的答案建议在启动OSK时禁用文件系统重定向。但是,禁用文件系统重定向(即使是在很短的时间内)是一种非常危险的行为,我不建议这样做。虽然启动另一个流程可能看起来很混乱,只是为了让你可以启动另一个流程,但我认为这是解决你问题的最佳方案

    这里有一些更有趣的观察结果:。特别有趣的是,
    CreateProcess
    被阻止启动OSK。它必须由
    ShellExecuteEx
    完成。或者想必是
    ShellExecute
    ,但正如我文章的普通读者所知道的那样,我之所以避开
    ShellExecute
    ,是因为它的错误处理机制已经失效

    我想说,作为旁白,如果您真的必须作为x86进程执行,那么以任何CPU为目标似乎是错误的。您应该以x86为目标


    更新

    从评论和你的问题编辑中可以清楚地看出,你还没有完全理解这个答案。我会试着把它说清楚一点。您需要以下内容:

  • 一个32位的进程,用于使用一个函数
  • 用于启动OSK的64位进程

  • 这是两个过程。您的主进程是32位进程。当您需要显示OSK时,启动64位进程,该进程将依次启动OSK。64位进程可以在启动OSK后立即终止。

    谢谢您的回答。以x86为目标并不能解决osk问题。对于我的案例,最快的解决方案是将path设置为x64 path,在我的案例中,它是“C:\Windows\WinSxS\amd64\u microsoft-Windows-osk\u 31bf3856ad364e35\u 10.0.10586.0\u none\u 37426bc50445e4b2\osk.exe”。此路径是否在其他操作系统中更改?编辑:我想你不明白我说的话。您应该从64位进程启动OSK,并将
    UseShellExecute
    设置为
    true
    。我就是这么说的。为了100%清楚地重复关键点:“要解决这个问题,您需要创建一个简单的x64可执行文件来启动OSK。”也许您可以再仔细阅读一下答案。最后一段指出,您需要在32位进程中运行代码才能使用Awesomium。在这种情况下,您为什么要选择AnyCPU并考虑在64位prospect中运行呢。如果您的代码必须在32位进程中执行,请以x86为目标。如果您有必须在64位进程中运行的代码,那么您需要两个进程。我现在很困惑。但设置64位osk路径目前似乎是一个简单的解决方案,而设置64位osk路径目前似乎是一个简单的解决方案。不,那一点也不好。谢谢你的回答。以x86为目标并不能解决osk问题。最快的解决方案