我的Win32应用程序如何从我的UWP应用程序中窃取焦点?

时间:2018-03-28 18:23:36

标签: c# wpf uwp windows-10

我尝试过以下代码:

[DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern IntPtr SetFocus(IntPtr hwnd);

void TakeFocus()
{
    var process = Process.GetProcessesByName("myProcess").FirstOrDefault();
    if (process != null)
    {
        // Tried each of the following:
        ShowWindow(process.MainWindowHandle, 1);
        ShowWindow(process.MainWindowHandle, 3);
        ShowWindow(process.MainWindowHandle, 9);
        ShowWindow(process.MainWindowHandle, 5);
        SetFocus(process.MainWindowHandle);
        SetForegroundWindow(process.MainWindowHandle);
    }
}

我有一个WPF伴侣应用程序,它在后台运行,而UWP应用程序在前台运行。他们通过WebSocket进行通信。我试图在WPF应用程序中创建一个方法,以便它(或任何其他窗口)可以从激活的UWP应用程序窃取焦点,将其发送到挂起状态。我尝试的任何东西似乎都没有用,并且没有办法以编程方式让UWP应用程序在不使用Launcher类的情况下暂停AFAIK(对我来说不是一个选项,除非有一种方法可以调用它而不实际启动某些东西 - 我还没有能够做到这一点)。通常情况下,我认为它无法完成,但我已经看过这样做的程序。例如,Steam大图模式将从后台进程启动时从UWP应用程序中窃取焦点。

1 个答案:

答案 0 :(得分:3)

Windows 2010的Spring 2018更新中提供了以编程方式挂起UWP的受支持方式。它已在Insider版本/ SDK中提供。这是要调用的API:

https://docs.microsoft.com/en-us/uwp/api/windows.system.appresourcegroupinfo.startsuspendasync#Windows_System_AppResourceGroupInfo_StartSuspendAsync

IList<AppDiagnosticInfo> infos = await AppDiagnosticInfo.RequestInfoForAppAsync();
IList<AppResourceGroupInfo> resourceInfos = infos[0].GetResourceGroups();
await resourceInfos[0].StartSuspendAsync();

这是一个简单的示例应用程序: https://1drv.ms/u/s!AovTwKUMywTNoYQ3PrmBfZIGXmbULA