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)
    {
        //异常处理
    }
}
posted @ 2024-03-05 16:43  xhubobo  阅读(370)  评论(0编辑  收藏  举报