我尝试过以下代码:
[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应用程序中窃取焦点。
答案 0 :(得分:3)
Windows 2010的Spring 2018更新中提供了以编程方式挂起UWP的受支持方式。它已在Insider版本/ SDK中提供。这是要调用的API:
IList<AppDiagnosticInfo> infos = await AppDiagnosticInfo.RequestInfoForAppAsync();
IList<AppResourceGroupInfo> resourceInfos = infos[0].GetResourceGroups();
await resourceInfos[0].StartSuspendAsync();
这是一个简单的示例应用程序: https://1drv.ms/u/s!AovTwKUMywTNoYQ3PrmBfZIGXmbULA