gpt4 book ai didi

c# - toast 窗口有时不在前面

转载 作者:行者123 更新时间:2023-11-30 13:01:02 26 4
gpt4 key购买 nike

我试图让我的 toast 窗口与托盘气球提示完全相同。它必须留在每个窗口前,而不是抢走焦点。但是当我按下 Windows 7 右下角的显示桌面按钮并在 5 秒后显示此 toast 窗口时,它不会显示在我的屏幕上。但是当我在任务栏中选择另一个窗口时,它会随后显示。

当我将 top most 用于 toast 形式时,它始终正确显示,但随后它从 directx 游戏等中窃取焦点并返回到桌面,因此我无法使用 top most。

这就是我正在做的:

NotificationForm form = new NotificationForm(5000, new Size(400, 300), img, url);
NativeMethods.ShowWindow(form.Handle, (int)WindowShowStyle.ShowNoActivate);
NativeMethods.SetWindowPos(form.Handle, (IntPtr)SpecialWindowHandles.HWND_TOP, 0, 0, 0, 0,
SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOACTIVATE);

完整源代码在这里:

https://github.com/ShareX/ShareX/blob/master/ShareX/Forms/NotificationForm.cs

我认为 Windows 气球提示使用最多,并且在玩全屏 directx 游戏时仍然设法不偷走焦点。不确定它是如何工作的。

最佳答案

如果我没记错的话,我认为 Windows 气球提示实际上并不是 Windows。我认为他们使用桌面“窗口”并直接在屏幕上绘制。也许看看尝试找到事件窗口并在全屏时直接在其上绘制“ toast ”而不是创建另一个窗口?我曾经为 CRM 套件做过类似的事情,我们有一个全屏 View ,我们希望为有视力障碍的 CSR 提供​​可访问性覆盖。这是我为实现这一目标所做的工作:

  • GetActiveWindow() 获取当前焦点窗口的句柄
  • GetWindowRect() 并将其与屏幕尺寸进行比较以确定它是否是全屏(因为最大化的程序仍然比全屏短,因为有任务栏)
  • 如果是全屏,GetDC() 检索用于绘图的设备上下文(我相信这是 .NET 中的 Graphics 对象)
  • 然后我直接在该窗口上绘制对象,覆盖该位置屏幕上的内容。透明度有点难做到,但并非不可能。查看 alpha 混合以及与之相关的数学。

它不是特别漂亮,但对我来说已经足够好了。

关于c# - toast 窗口有时不在前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20765944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com