如何在C#中闪烁整个屏幕?

3
我的程序需要一些时间来完成计算,因此我想在运行它时读取一些网页,并在屏幕闪烁时(完成计算的通知)返回我的程序。唯一缺失的部分是 - 如何在C#中闪烁整个屏幕?如果这很重要,我使用WPF。请注意 - 我的程序不可见,其他程序(例如Web浏览器)占据整个屏幕(这就是问题的关键,否则,我根本不需要任何通知)。闪烁= 闪烁。

3
请参考这个网址:https://dev59.com/yFfUa4cB1Zd3GeqPDwSU。该网址讨论如何使屏幕闪烁来提醒用户。 - Mamta D
谢谢,但这并没有什么用。这需要你的应用程序显示出来 - 在这种情况下,我甚至不需要闪存任何东西,因为我可以只显示一条消息。问题是,我的应用程序不可见,因为它被 Web 浏览器覆盖。 - greenoldman
4个回答

4

我的第一个建议是:在计算完成后,让您的程序打开一个顶层窗口,并将其设置为透明背景和某种颜色(例如白色),然后再关闭该窗口。需要注意的是,在闪烁期间,此窗口始终位于最上面,因此您将无法与底层窗口进行交互,因为该窗口将吞噬这些事件。另一种选择是像大多数其他Windows应用程序(如Outlook或Messenger)一样:显示一个简短的通知框,点击该框即可进入相关的应用程序(即您的程序)。


谢谢,我会等待其他建议,并将您的想法作为备选方案。它有点过于侵入性了。 - greenoldman
+1 提到通知框 - 这也是我首先想到的事情。 - Doc Brown
我知道你要求屏幕闪烁,但我不得不承认我更倾向于使用通知框,这样对于癫痫患者触发癫痫的可能性更小。 - mtijn
我知道这个影响,我只是需要我所需的东西,并且我只是该应用程序的用户(我不是癫痫患者)。 - greenoldman

4
我认为更加“正常”的做法是将应用程序安装为系统托盘图标 - 这样你就可以在任何状态更改时进行更改。

这是我的研究项目,我不安装任何东西,也不出售或分发它。请不要猜测太多你不知道的事情。而且我已经有太多的通知在飞来飞去了(系统托盘已经占据了屏幕的25%)。此外,我不认为将应用程序变成系统托盘有助于闪烁整个屏幕。 - greenoldman

2
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern Int16 FlashWindowEx(ref FLASHWINFO pwfi);

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct FLASHWINFO {
    public UInt32 cbSize;
    public IntPtr hwnd;
    public UInt32 dwFlags;
    public UInt32 uCount;
    public UInt32 dwTimeout;
}

public const UInt32 FLASHW_STOP = 0; 

public const UInt32 FLASHW_CAPTION = 1; 

public const UInt32 FLASHW_TRAY = 2; 

public const UInt32 FLASHW_ALL = 3;         

public void Flash() {

    FLASHWINFO flashInfo = new FLASHWINFO();
    flashInfo.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(flashInfo);
    flashInfo.hwnd = this.Handle; // get the window handle
    flashInfo.dwFlags = FLASHW_TIMERNOFG | FLASHW_ALL;
    flashInfo.uCount = UInt32.MaxValue;
    flashInfo.dwTimeout = 0;

    FlashWindowEx(ref flashInfo);
}

如果我没记错的话,它只会闪烁我的窗口,而不是整个屏幕,对吧? - greenoldman
@ greenoldman 是的,这个答案的代码只会闪烁指定了属性FLASHWINFO.hwnd的窗口句柄(在上面设置为this.Handle)。 - reformed

1

我认为你不能在WPF中技术上闪烁屏幕。也许可以使用Win32函数。但是,是否有可能截取屏幕并显示一个窗口,该窗口显示修改版本的截图?此窗口必须声明为TopMost并覆盖您的屏幕,您的图像可以通过增加透明通道来进行修改。

编辑:好的,我想我误解了“闪烁”。如果您只想显示一个带有一种颜色的闪烁矩形,请查看Mamta Dalal发布的线程。


Win32可以,但必须与WPF兼容。我不能将任何东西设置为最顶层,我的窗口被最小化了,另一个程序(Web浏览器)占据了整个屏幕。 - greenoldman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接