如何用C#刷新整个屏幕?

时间:2011-10-07 11:17:29

标签: c# wpf notifications screen

我的程序完成计算需要一些时间,所以我想运行它,同时阅读一些网页,当屏幕闪烁(完成计算的通知)时,我会回到我的程序。

唯一缺少的部分是 - 如何在C#中刷新整个屏幕?如果这很重要,我会使用WPF。

请注意 - 我的程序不可见,其他程序(例如网络浏览器)占用整个屏幕(这就是问题所在,因为否则,我不需要任何通知)。

Flash =闪烁。

4 个答案:

答案 0 :(得分:4)

我的第一种方法是:在计算完成后,程序打开一个具有透明背景的新的最顶层窗口,并将其设置为某种颜色(白色)一段短暂的间隔并再次关闭窗口。请注意,当窗口位于顶部时,您将无法在闪烁期间与底层窗口进行交互,因为窗口将占用这些事件。或者,您可以执行大多数其他Windows应用程序(如outlook或messenger)执行的操作:显示可单击的简短通知框,以转到相关应用程序(您的程序)。

答案 1 :(得分:4)

我认为更“正常”的做法是将应用程序安装为系统托盘图标 - 然后您可以在状态发生任何变化时进行更改。

答案 2 :(得分: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);
}

答案 3 :(得分:1)

我认为您不能在技术上使用WPF刷新屏幕。也许有Win32功能。但是,是否可以制作屏幕截图并显示一个显示该屏幕截图的修改版本的Windows?此窗口必须声明为TopMost并覆盖您的屏幕,并且可以通过增加alpha通道来修改您的图像。

编辑:好的,我想我误解了“闪光”。如果你只是想用一种颜色显示一个闪烁的矩形,看看Mamta Dalal发布的帖子。