如何检测 Windows Game Bar 在 .NET 中是否处于活动状态?

问题描述 投票:0回答:1

我正在尝试检测 Windows 游戏栏是否打开并重定向输入,如 https://devblogs.microsoft.com/oldnewthing/20160629-00/?p=93775 但在 Vb.Net 或 C# Winforms Framework 4.7 中

放弃 ChadGPT 垃圾建议后,我通过转换器运行 C++ 代码并最终得到这个。

using Microsoft.WindowsAPICodePack.GamingServices;
using System;
using System.Runtime.InteropServices;

namespace YourNamespace
{
    class YourClass
    {
        static GamingServices.GameBarStatics gameBarStatics;
        static bool isVisible;
        static bool isInputRedirected;
        static EventRegistrationToken tokenVisibility;
        static EventRegistrationToken tokenInput;

        static void Main(string[] args)
        {
            gameBarStatics = GamingServices.GameBarStatics.GetDefault();
            isVisible = gameBarStatics.IsVisible;
            isInputRedirected = gameBarStatics.IsInputRedirected;
            tokenVisibility = gameBarStatics.VisibilityChanged += GameBarStatics_VisibilityChanged;
            tokenInput = gameBarStatics.InputRedirected += GameBarStatics_InputRedirected;

            // Rest of your code...
        }

        static void GameBarStatics_VisibilityChanged(object sender, object e)
        {
            // Handle visibility changed event...
        }

        static void GameBarStatics_InputRedirected(object sender, object e)
        {
            // Handle input redirected event...
        }
    }
}
Imports Microsoft.WindowsAPICodePack.GamingServices

Class GameBar
    Shared gameBarStatics As GamingServices.GameBarStatics
    Shared isVisible As Boolean
    Shared isInputRedirected As Boolean
    Shared tokenVisibility As EventRegistrationToken
    Shared tokenInput As EventRegistrationToken

    Public Sub New()
        gameBarStatics = GamingServices.GameBarStatics.GetDefault()
        isVisible = gameBarStatics.IsVisible
        isInputRedirected = gameBarStatics.IsInputRedirected
        tokenVisibility = AddressOf GameBarStatics_VisibilityChanged
        AddHandler gameBarStatics.VisibilityChanged, AddressOf GameBarStatics_VisibilityChanged
        tokenInput = AddressOf GameBarStatics_InputRedirected
        AddHandler gameBarStatics.InputRedirected, AddressOf GameBarStatics_InputRedirected
    End Sub

    Private Shared Sub GameBarStatics_VisibilityChanged(ByVal sender As Object, ByVal e As Object)
        Debug.Print("GameBarStatics_VisibilityChanged")
    End Sub

    Private Shared Sub GameBarStatics_InputRedirected(ByVal sender As Object, ByVal e As Object)
        Debug.Print("GameBarStatics_InputRedirected")
    End Sub
End Class

但是,我似乎找不到正确的 NuGet 包来安装,从而暴露

GamingServices

注意 C# 代码是原始的,我对它不够熟练,无法查看它是否有错误,我修改了翻译后的 VB.Net 代码,因为它并不完美,但不幸的是,我无法测试我是否更改了内容有效。

c# .net vb.net windows-10 windows-api-code-pack
1个回答
0
投票

打开

Tools/Options...
并在
NuGet Package Manager/General
下将
Default package management format:
设置为
PackageReference

安装

Microsoft.Windows.SDK.Contracts
NuGet 包时,单击
Configure
并将
Windows.Foundation.UniversalApiContract
添加为
Packet Source Mapping

您现在可以在代码中引用

Windows.Gaming.UI.GameBar

Private gbSupported As Boolean = False

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim osVer As Version = Environment.OSVersion.Version
    If osVer.Major >= 10 AndAlso osVer.Build >= 10586 Then
        gbSupported = True
    End If
End Sub

注意:取消注释

app.manifest
中的以下行,让
Environment.OSVersion.Version
报告正确的数字。

<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

在代码的其他地方使用

If gbSupported AndAlso Windows.Gaming.UI.GameBar.IsInputRedirected Then
    'do stuff
End If

我将其填充到计时器中,因为我无法让

Windows.Gaming.UI.GameBar.IsInputRedirectedChanged
事件可靠地工作。

© www.soinside.com 2019 - 2024. All rights reserved.