.net 如何从C#运行UWP应用并获取主窗口句柄

06odsfpq  于 2023-03-20  发布在  .NET
关注(0)|答案(1)|浏览(388)

在Windows 11中,以下代码能够运行并获取winver.exe的主窗口句柄:

public IntPtr Start()
    {
        IntPtr id = 0;
        using (Process process = Process.Start("c:\\Windows\\System32\\winver.exe"))
        {
            
            for (int i = 0; i < 10 && id == 0; i++)
            {
                Thread.Sleep(200);
                try
                {
                    process.WaitForInputIdle();
                } catch { }
                process.Refresh();
                id = process.MainWindowHandle;
            }

            return id;
        }

        return 0;
    }

然而,将“winver.exe”改为“calc.exe”、“notepad.exe”或任何商店下载应用程序都会导致窗口句柄为0,我认为这与UWP应用程序有关(但我远不是Windows相关领域的Maven)。
有没有办法从C#运行和获取UWP应用的主窗口句柄?

pjngdqdw

pjngdqdw1#

您可以使用launch your UWP apps through URI,并使用GetForegroundWindow获取窗口句柄。
我使用了两种方法来启动UWP应用程序,第一种使用LaunchUriAsync,第二种使用Process启动。要从C#启动协议,请使用UseShellExecute=true启动Process对象。您不能使用Explorer.exe作为进程启动UWP。

//first way
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

bool result = await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-windows-store://navigatetopage/?Id=Gaming"));
var handle1 = GetForegroundWindow();

//second way
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.FileName = @"ms-windows-store://navigatetopage/?Id=Gaming";
process.StartInfo = startInfo;
process.Start();
Thread.Sleep(2000);
var handle2 = GetForegroundWindow();

相关问题