激活Focus Assist Windows 10以编程方式设置C#

Exp*_*rex 6 c# wpf windows-10

我正在构建C#WPF应用程序,并希望能够以编程方式启用和禁用Windows系统功能Focus Assist

我尝试研究如何以编程方式控制此功能,但看不到它的任何内容(可能是因为它是一项新的系统功能)。我看过有关使用该Windows.System库的说明,但是对焦辅助似乎并没有分开

谁能指出我正确的方向?

NoP*_*God 0

我想出了以下内容。在 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)