我正在尝试检测 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 代码,因为它并不完美,但不幸的是,我无法测试我是否更改了内容有效。
打开
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
事件可靠地工作。