2016-01-20 20 views
0

我正在用Awesomium開發wpf應用程序,但同時我想使用OSK(Windows 10原生屏幕鍵盤)。當我運行Process.Start(「osk.exe」)時,出現錯誤提示「無法在屏幕鍵盤上啓動」。在同一個CPU應用程序中使用Awesomium(x86)和OSK(x64)

如果我刪除了Prefer-32位選項,我可以運行OSK。但我需要Awesomium。我該如何處理?

編輯:我已將UseShellExecute設置爲true,但結果相同。

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

Prefer 32 Bit is what Awesomium requires

+0

'UseShellExecute'默認爲'true'。所以'osk.StartInfo.UseShellExecute = true;'沒有效果。 –

回答

2

OSK是一個非常特殊的過程,因爲它可以用於注入輸入到其他應用程序,是一個潛在的安全弱點。操作系統提出的安全措施的後果之一是,它不能輕易由WOW64進程啓動。爲了解決這個問題,你需要創建一個啓動OSK的簡單的x64可執行文件。然後,從運行在WOW64下的x86進程開始,在需要啓動OSK時啓動該中間可執行文件。顯然,你只能從WOW64進程中做到這一點。如果您在32位系統上運行,那麼您不得嘗試啓動64位可執行文件。

請注意,此問題的答案(Unable to launch onscreen keyboard (osk.exe) from a 32-bit process on Win7 x64)建議在啓動OSK時禁用文件系統重定向。但是,即使在很短的時間內禁用文件系統重定向也是非常危險的行爲,我不建議這樣做。儘管啓動另一個流程看起來很麻煩,以至於您可以開始另一個流程,但我認爲這是解決您的問題的最佳解決方案。

這裏還有一些更有意思的觀察:https://stackoverflow.com/a/23128178/505088。特別感興趣的是CreateProcess被阻止啓動OSK。它必須由ShellExecuteEx完成。或大概ShellExecute,但作爲我的帖子的普通讀者會知道,我避開ShellExecute,因爲它的錯誤處理機制。

我想說,如果你真的必須執行x86進程,那麼定位AnyCPU似乎是錯誤的。你應該瞄準x86。


更新

這是從的意見和你的問題的編輯,你還沒有完全理解這個答案清晰。我會試着更清楚地說明一下。您需要以下內容:

  1. 一個32位進程爲了使用Awesomium。
  2. 64位進程爲了啓動OSK。

所以,這是兩個過程。你的主要過程是32位的。當你需要顯示OSK時,啓動64位進程,然後啓動OSK。一旦啓動OSK,64位進程就可以終止。

+0

謝謝你的回答。瞄準x86並不能解決osk問題。對於我的情況最快的解決方案是設置路徑爲x64路徑,在我的情況下它是「C:\ Windows \ WinSxS \ amd64_microsoft-windows-osk_31bf3856ad364e35_10.0.10586.0_none_37426bc50445e4b2 \ osk.exe」。此路徑在其他操作系統中是否更改?編輯:它改變 – Kubi

+0

我不認爲你明白我說的話。您應該使用'UseShellExecute'設置爲'true'來從64位進程啓動OSK。這就是我所說的。只需要重複100%清晰的關鍵點即可:**「要處理這個問題,您需要創建一個啓動OSK的簡單x64可執行文件。」**也許您可能會再次仔細閱讀答案。 –

+0

最後一段提到你必須在32位進程中運行代碼才能使用Awesomium。在這種情況下,你爲什麼要選擇AnyCPU並且滿足64位潛在客戶的前景。如果您的代碼必須在32位進程中執行,則目標x86。如果您的代碼必須在64位進程中運行,那麼您需要兩個進程。 –

相關問題