質問: oskPath; process1.Start(); } ``` ●System.ComponentModel.Win32Exception: '指定されたパスが見つかりません。' 1,2,3ともにosk.exeをnotepad.exeに変更すると実行される。 ### 補足情報(FW/ツールのバージョンなど) Windows10 64bit VisualStudio2019 4,5を追加しましたが、32ビットのチェックが付いていると、同様のエラーになってしまいます。
回答: アプリケーションをx86で作成していませんか? 32ビットアプリですと`C:\Windows\System32`は`C:\Windows\SysWOW64`にリダイレクトされます。 このために、64ビット版しか存在しないosk.exeは32ビットアプリから`C:\Windows\System32`にアクセスすると、実際には`C:\Windows\SysWOW64`のファイルを見るのでosk.exeがないということになります。 ``` System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe"); ``` とすればリダイレクトされずにSystem32フォルダを参照するので、32ビットアプリでもosk.exeが起動できるかと思います。 >プロパティのその他>StartInfo>FileName からC:\Windows\System32 にあるosk.exeが表示されず選択できない。 こちらについても、VisualStudioが32ビットアプリのため、SysWOW64にリダイレクトされている為に表示されない状態となっています。 追記 すみません。x64だとsysnativeでアクセスするとエラーとなりますね。 ``` if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess) { Console.WriteLine("32ビットアプリ"); System.Diagnostics.Process.Start(@"C:\Windows\sysnative\osk.exe"); } else { Console.WriteLine("64ビットアプリ"); System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe"); } ``` これで、AnyCPUで「32ビットを優先」にチェックを入れると32ビットアプリ側、チェックを外すと64ビットアプリ側を通りました。 ### さらに追記 上記回答時にテストしていたPCとは別のPCで確認したところ、質問者さんと同じと思われる状況になりました。 Windows10Pro 64bit バージョン1903の環境なのですが、32ビットのコマンドプロンプト(C:\Windows\SysWOW64\cmd.exe)にて下記のようになりました。 ``` c:\>dir c:\windows\sysnative\osk.exe ドライブ C のボリューム ラベルは Windows です ボリューム シリアル番号は XXXX-XXXX です c:\windows\sysnative のディレクトリ 2019/11/19 15:02 642,560 osk.exe 1 個のファイル 642,560 バイト 0 個のディレクトリ 400,892,551,168 バイトの空き領域 c:\>c:\windows\sysnative\osk.exe ファイル c:\windows\sysnative\osk.exe が見つかりません。 ``` dirでファイルが見つかるのに実行することが出来ません。 なぜ、このような現象になるのかは調べきれませんでした。 そこで、方向性を変えて、リダイレクトを無効化してみました。 ``` [DllImport("kernel32.dll", SetLastError = true)] static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); [DllImport("kernel32.dll", SetLastError = true)] static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); private void Button1_Click(object sender, EventArgs e) { IntPtr wow64Value = IntPtr.Zero; try { // File System Redirectorを無効化する Wow64DisableWow64FsRedirection(ref wow64Value); System.Diagnostics.Process.Start(@"C:\Windows\system32\osk.exe"); } finally { // File System Redirectorを有効化する Wow64RevertWow64FsRedirection(wow64Value); } } ``` こちらの方法ですと、質問者さんと同じであろう環境の方でも「32ビットを優先」のチェックに関わらずoskを起動することが出来ました。