【问题标题】:How Can My Win32 App Steal Focus From My UWP App?我的 Win32 应用程序如何从我的 UWP 应用程序中窃取焦点?
【发布时间】:2018-03-31 04:59:12
【问题描述】:

我尝试了以下代码:

[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 应用程序中窃取焦点,将其发送到挂起状态。我尝试的任何方法似乎都不起作用,并且没有办法在不使用 Launcher 类的情况下以编程方式使 UWP 应用程序自行暂停 AFAIK(这对我来说不是一个选项,除非有一种方法可以在不实际启动某些东西的情况下调用它——我无法去做这个)。通常我会认为它无法完成,但我已经看到了这样做的程序。例如,Steam 大画面模式会在 UWP 应用从后台进程启动时窃取其焦点。

【问题讨论】:

  • 您是否尝试设置键盘焦点?这似乎有点明显,但是...
  • 谢谢,我没试过。不幸的是,它没有用。我会把它添加到问题中。

标签: c# wpf uwp windows-10


【解决方案1】:

支持以编程方式挂起 UWP 的方式在 Windows 10 的 2018 年春季更新中可用。它已在 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

【讨论】:

  • 不错!我了解了新的重启应用功能,但一定错过了。
  • 你知道任何关于如何在清单中实现 AppResourceGroupInfo 的文档吗?
  • 我在答案中添加了一个代码 sn-p。如果还需要什么,请告诉我。
  • 第一行抛出'Element not found'异常。
  • 我已通过指向完整示例应用程序的链接更新了答案。是的,您需要当前构建的功能。在为您自己的应用程序调用它时,您实际上不应该需要它,因此我们将其视为一个错误。另请注意,您也可以从 WPF 应用程序调用它。只要您引用正确的 Windows.winmd 文件,它就可以正常编译。此外,您还需要使用 appid 调用重载,以指定要暂停的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多