C# 在同一个CPU应用程序中使用Awesomium(x86)和OSK(x64)
我正在用Awesomium开发一个wpf应用程序,但同时我想使用OSK(Windows10本机屏幕键盘)。当我简单地运行Process.start(“osk.exe”)时,出现一个错误,提示“无法在屏幕键盘上启动” 如果我删除prefere-32位选项,我可以运行OSK。但我需要冬虫夏草。我该怎么处理 编辑:我已将UseShellExecute设置为true,但结果相同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
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位进程,该进程将依次启动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位进程,该进程将依次启动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问题。最快的解决方案