【问题标题】:Toggling Focus Assist mode in Win 10 Programmatically以编程方式在 Win 10 中切换焦点辅助模式
【发布时间】:2019-04-02 14:16:43
【问题描述】:

在我看过的几乎所有地方都有一些未回答的问题,所以我想我应该将我的问题添加到计数中。

我希望以编程方式在 Win 10 中切换 Focus Assist 模式,但到目前为止,我在官方和非官方渠道中都未能找到很多关于此的文档。

如果我无法以编程方式切换焦点辅助,我将需要基本上模拟相同的行为含义,即我需要拦截和静噪传入的通知,直到它被关闭,然后显示在此期间被静音的通知.

似乎目前唯一可用的方法是使用反向 WNF 信息编写一些 c++,然后祈祷它不会在更新中中断。在我进入那个兔子洞之前,我想我会看看有没有人这样做过,或者可以指出我没有考虑过的资源。

通知侦听器很棒,让我可以访问所述通知以满足我的次要要求,但它不允许我在它们进入时将它们静音,因为它与 vs 并行运行会中断通知流。

对于以后提出这个问题的人,我发现这些很有帮助:

【问题讨论】:

    标签: c# uwp notifications windows-10


    【解决方案1】:

    我希望以编程方式在 Win 10 中切换焦点辅助模式,但迄今为止没有成功

    目前UWP不提供这样的api来编程切换Focus Assist模式。如果您确实需要此功能,请随时在UserVoice 上询问此功能。

    【讨论】:

    • 谢谢,感谢您的帮助,并将此内容发布到 UserVoice。
    【解决方案2】:

    您可以使用 WNF 机制切换模式。

    生成文件“0”的二进制内容 = 00 00 00 00 (hex) 和文件“1”= 02 00 00 00(十六进制)

    例如在 git bash 中

    echo -n -e "\x00\x00\x00\x00" > 0
    echo -n -e "\x02\x00\x00\x00" > 1
    

    克隆仓库:https://github.com/ionescu007/wnfun

    pip install Pywin32
    pip install hexdump
    

    开启优先模式

    python WnfDump.py -w WNF_SHEL_QUIET_MOMENT_SHELL_MODE_CHANGED 1
    

    关闭对焦辅助

    python WnfDump.py -w WNF_SHEL_QUIET_MOMENT_SHELL_MODE_CHANGED 0
    

    如果您找到打开“仅警报”模式的方法,请告诉我。

    您也可以使用相同的技术 C++。

    编辑:实际上,该命令激活为“全屏模式”设置的模式和文件内容 01 00 00 00,将激活“游戏模式”。 如果两者都关闭,则该命令将无效。

    【讨论】:

    • 很好的答案!我尝试使用包含的 .exe 但到目前为止不成功:github.com/ionescu007/wnfun/issues/2
    • 谢谢!请确保您在焦点辅助设置中配置了自动规则(检查编辑部分)
    • 是的,我做到了,它在使用你描述的 .py 时有效,但不适用于 .exe,请参阅问题链接
    【解决方案3】:

    就像 Pavel Henrykhsen 的回答所说,有一种程序化的方式,尽管没有记录和不受支持。 Here is an implementation, albeit written in Rust.

    相关函数是来自ntdll.dllZwUpdateWnfStateData。在这种情况下,相关论点是

    1. 我在https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools/blob/80d7fcc8df9c3160c814c60f5121ae46c560a1b5/NtApiDotNet/NtWnfWellKnownNames.cs#L865找到的状态ID
    2. 具有值[0x02, 0x00, 0x00, 0x00] 的缓冲区
    3. 缓冲区的长度

    之后的所有参数都可以安全地忽略。

    // Pseudo-code
    ZwUpdateWnfStateData(
                0xd83063ea3bf5075UL,
                new byte[] {0x02, 0x00, 0x00, 0x00},
                4,
                0,
                0,
                0,
                0,
            );
    

    这似乎确实依赖于在焦点模式设置中打开的“当我在全屏模式下使用应用程序时”设置。

    另外,如果有人尝试使用它来启用焦点模式,我建议首先禁用焦点模式(改为传递new byte[] {0x00, 0x00, 0x00, 0x00})。然后,几毫秒后,就可以安全地启用焦点模式了。

    【讨论】:

    • 您好 Stefnotch,我也在寻找类似的解决方案,在我看来,您的解决方案非常合适,感谢您的辛勤工作和研究。虽然我有一个问题是 - 你提到This does seem to rely on the "when I'm using an app in full-screen" setting being turned on in the focus mode settings. 那是什么意思?我的应用永远不会处于全屏模式?虽然我很快就会尝试你的脚本。
    • @MP Windows 10 有一些“焦点辅助”设置。如果你检查它们,你会看到一些“自动规则”,即“在这些时间”、“当我复制我的显示器时”、“当我玩游戏时”,最后是“当我使用全屏模式下的应用程序”。我的解决方案显然依赖于打开“当我在全屏模式下使用应用程序时”规则。它无需将任何应用程序置于全屏模式即可工作:)
    • Stefnotch,看起来它在没有应用程序处于全屏模式的情况下也能正常工作。感谢您的支持!
    • 太棒了,很高兴听到你让它工作了!漂亮,请为您认为有用的答案投票;)
    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 2021-09-24
    • 2011-10-05
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多