Process.Start找不到指定文件的说明
最近在触屏Win10中需要调用osk.exe 显示虚拟键盘,其路径为:C:\Windows\System32\osk.exe。由于软件是32位的,在使用Process.Start方法时系统默认启用了文件系统重定向,将其指向路径:C:\Windows\SysWoW64\osk.exe,造成找不到文件。
1、解决方法1:设置文件系统重定向
参考:C# 通过Process.Start(@“C:\Windows\System32\osk.exe“)调用系统软键盘,提示无法找到文件路径解决方法
解决思路是:先禁用调用线程的文件系统重定向,然后还原调用线程的文件系统重定向。这涉及到Win32中的API—Wow64DisableWow64FsRedirection、Wow64RevertWow64FsRedirection。
1.1 Wow64DisableWow64FsRedirection
微软对该方法的说明如下所示:
1.2 Wow64RevertWow64FsRedirection
微软对该方法的说明如下所示:
1.3 代码示例
[DllImport("kernel32.dll", SetLastError = true)] public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); private static void OpenVirtualKeyboard() { //判断软键盘是否进程是否已经存在,如果不存在进行调用 var processArray = Process.GetProcessesByName("osk"); if (processArray.Any()) { return; } try { var ptr = new IntPtr(); var isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr); if (isWow64FsRedirectionDisabled) { Process.Start(@"C:\Windows\System32\osk.exe"); var isWow64FsRedirectionReverted = Wow64RevertWow64FsRedirection(ptr); } } catch (Exception e) { //异常处理 } }
2、解决方法2:使用sysnative
参考:Process.Start(@"C:\Windows\System32\osk.exe") 找不到指定文件
使用C:\Windows\sysnative\osk.exe代替C:\Windows\System32\osk.exe,可以在32位应用的代码里面访问64位应用。
示例代码:
private static void OpenVirtualKeyboard() { //判断软键盘是否进程是否已经存在,如果不存在进行调用 var processArray = Process.GetProcessesByName("osk"); if (processArray.Any()) { return; } try { //实测该方法仍然提示找不到文件 //Process.Start(@"C:\Windows\sysnative\osk.exe"); //该方法可以打开Win10软键盘 var startInfo = new ProcessStartInfo(@"C:\Windows\Sysnative\cmd.exe", "/c osk.exe") { CreateNoWindow = true, UseShellExecute = false }; Process.Start(startInfo); } catch (Exception e) { //异常处理 } }