我正在构建C#WPF应用程序,并希望能够以编程方式启用和禁用Windows系统功能Focus Assist。
我尝试研究如何以编程方式控制此功能,但看不到它的任何内容(可能是因为它是一项新的系统功能)。我看过有关使用该Windows.System库的说明,但是对焦辅助似乎并没有分开
谁能指出我正确的方向?
我想出了以下内容。在 Windows 10 22H2 19045.3803 中测试。
笔记:
在 Windows Focus Assist 设置下, 或When I'm duplicating my display必须When I'm playing a game设置为On,具体取决于您打算以编程方式激活的模式。
为了打开聚焦辅助,您有时需要先发出命令将其关闭(即使它已经关闭)。为了获得最佳效果,请始终关闭然后再打开。
using System.Runtime.InteropServices;
while(true)
{
var focusAssistMode = Console.ReadLine() == "on" ? FocusAssistMode.Fullscreen : FocusAssistMode.Off;
var result = FocusAssistHelper.SetFocusAssistMode(focusAssistMode);
if (result == 0)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine($"Failed with error code {result}");
};
}
public static class FocusAssistHelper
{
[DllImport("ntdll.dll", SetLastError = true)]
static extern int ZwUpdateWnfStateData(
ref ulong StateName,
IntPtr Buffer,
int Length,
Guid TypeId,
IntPtr ExplicitScope,
uint MatchingChangeStamp,
bool CheckStamp
);
[DllImport("ntdll.dll", SetLastError = true)]
static extern int ZwQueryWnfStateData(
ref ulong StateName,
Guid TypeId,
IntPtr ExplicitScope,
out uint ChangeStamp,
IntPtr Buffer,
ref int BufferSize
);
const ulong WNF_SHEL_QUIET_MOMENT_SHELL_MODE_CHANGED = 0xd83063ea3bf5075UL;
public static int GetFocusAssistMode(out FocusAssistMode mode)
{
var stateName = WNF_SHEL_QUIET_MOMENT_SHELL_MODE_CHANGED;
int bufferSize = 4;
var bufferPtr = Marshal.AllocHGlobal(bufferSize);
var result = ZwQueryWnfStateData(ref stateName, Guid.Empty, IntPtr.Zero, out _, bufferPtr, ref bufferSize);
if (result == 0)
{
var modeAsByteArray = new byte[bufferSize];
Marshal.Copy(bufferPtr, modeAsByteArray, 0, modeAsByteArray.Length);
mode = (FocusAssistMode)BitConverter.ToUInt32(modeAsByteArray);
}
else
{
mode = FocusAssistMode.Off;
}
return result;
}
public static int SetFocusAssistMode(FocusAssistMode mode)
{
var stateName = WNF_SHEL_QUIET_MOMENT_SHELL_MODE_CHANGED;
var modeAsByteArray = BitConverter.GetBytes((uint)mode);
var bufferPtr = Marshal.AllocHGlobal(modeAsByteArray.Length);
try
{
Marshal.Copy(modeAsByteArray, 0, bufferPtr, modeAsByteArray.Length);
return ZwUpdateWnfStateData(ref stateName, bufferPtr, modeAsByteArray.Length, Guid.Empty, IntPtr.Zero, 0, false);
}
finally
{
Marshal.FreeHGlobal(bufferPtr);
}
}
}
public enum FocusAssistMode : uint
{
Off = 0,
Game = 1,
Fullscreen = 2,
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |