如何使 WPF 窗口在任务栏上闪烁?

Posted

技术标签:

【中文标题】如何使 WPF 窗口在任务栏上闪烁?【英文标题】:How to make a WPF Window to blink on the taskbar? 【发布时间】:2011-07-04 08:16:00 【问题描述】:

在某个特定时刻,我的 WPF 应用程序需要用户关注。我知道可以使 Windows 7 任务栏图标以黄色闪烁。

到目前为止我试过了:

Window.Activate 尝试将窗口置于前台并激活它。 Window.Focus 尝试将此元素设置为焦点。

有什么建议吗?

【问题讨论】:

嗨,这个 URL 可能对你有帮助,***.com/questions/8924556/… 谢谢,泰米尔语 【参考方案1】:

这是一种可能的解决方案:http://www.jarloo.com/flashing-a-wpf-window/

在代码示例中,为 Window 类创建了两个扩展方法:FlashWindow 和 StopFlashingWindow:

private const UInt32 FLASHW_STOP = 0; //Stop flashing. The system restores the window to its original state.        private const UInt32 FLASHW_CAPTION = 1; //Flash the window caption.        
private const UInt32 FLASHW_TRAY = 2; //Flash the taskbar button.        
private const UInt32 FLASHW_ALL = 3; //Flash both the window caption and taskbar button.        
private const UInt32 FLASHW_TIMER = 4; //Flash continuously, until the FLASHW_STOP flag is set.        
private const UInt32 FLASHW_TIMERNOFG = 12; //Flash continuously until the window comes to the foreground.  


[StructLayout(LayoutKind.Sequential)]        
private struct FLASHWINFO        
            
    public UInt32 cbSize; //The size of the structure in bytes.            
    public IntPtr hwnd; //A Handle to the Window to be Flashed. The window can be either opened or minimized.


    public UInt32 dwFlags; //The Flash Status.            
    public UInt32 uCount; // number of times to flash the window            
    public UInt32 dwTimeout; //The rate at which the Window is to be flashed, in milliseconds. If Zero, the function uses the default cursor blink rate.        
         

[DllImport("user32.dll")]        
[return: MarshalAs(UnmanagedType.Bool)]        
private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);         



public static void FlashWindow(this Window win, UInt32 count = UInt32.MaxValue)        
            
    //Don't flash if the window is active            
    if (win.IsActive) return;             
    WindowInteropHelper h = new WindowInteropHelper(win);             
    FLASHWINFO info = new FLASHWINFO 
                                            
        hwnd = h.Handle,                                        
        dwFlags = FLASHW_ALL | FLASHW_TIMER,                                        
        uCount = count,                                        
        dwTimeout = 0                                    
    ;             

    info.cbSize = Convert.ToUInt32(Marshal.SizeOf(info));            
    FlashWindowEx(ref info);        
 

public static void StopFlashingWindow(this Window win)        
            
    WindowInteropHelper h = new WindowInteropHelper(win);             
    FLASHWINFO info = new FLASHWINFO();            
    info.hwnd = h.Handle;            
    info.cbSize = Convert.ToUInt32(Marshal.SizeOf(info));            
    info.dwFlags = FLASHW_STOP;            
    info.uCount = UInt32.MaxValue;            
    info.dwTimeout = 0;             
    FlashWindowEx(ref info);        

访问http://www.jarloo.com/flashing-a-wpf-window/ 获取完整源代码。

相当有趣的场景。我原以为这会很简单。如果我不得不做类似的事情,我会为这个问题添加书签:)

【讨论】:

虽然这个答案已经有好几年了,而且这个链接很有帮助,但如果你在这个网站上发布答案的基本部分会更好,或者你的帖子有被删除的风险See the FAQ where it mentions answers that are 'barely more than a link'.你可能如果您愿意,仍然包括链接,但仅作为“参考”。答案应该是独立的,不需要链接。【参考方案2】:

最好使用为此目的而设计的 Windows 7 功能 - 任务栏覆盖图标。 http://10rem.net/blog/2009/12/09/overlaying-icons-on-the-windows-7-taskbar-with-wpf-4 是您可以看到的众多地方之一。

如果在长时间运行的过程中需要注意,我会使用任务栏进度条覆盖(在 WPF 中也很容易做到)并将其状态从正常更改为暂停或错误,分别显示为黄色和红色.这会引起用户的注意。

【讨论】:

我通过在 0 和 1 之间交替 ProgressValue 来实现“闪烁”状态,即 0% 和 100%。时间间隔为500ms左右。【参考方案3】:

Scott 的例子要简单得多……谢谢 Scott!

https://scottstoecker.wordpress.com/2010/10/08/creating-a-flashing-taskbar-icon-using-flashwindow-with-xaml/

using System.Windows.Interop;
using System.Runtime.InteropServices;

[DllImport("user32")] public static extern int FlashWindow(IntPtr hwnd, bool bInvert);

WindowInteropHelper wih = new WindowInteropHelper(ThisWindow); 
FlashWindow(wih.Handle, true);

【讨论】:

完美,在 W10 1909 上就像一个魅力。Net Framework 4.7.2 ✅【参考方案4】:

按照 Kate 的建议,我使用了这样的任务栏进度:

XAML:

<Window.TaskbarItemInfo>
   <TaskbarItemInfo x:Name="taskBarItem"/>
</Window.TaskbarItemInfo>

cs:

taskBarItem.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Indeterminate;

这会使任务栏图标闪烁绿色,这足以让我的用例吸引用户注意长时间运行的应用程序。

【讨论】:

漂亮优雅的解决方案!

以上是关于如何使 WPF 窗口在任务栏上闪烁?的主要内容,如果未能解决你的问题,请参考以下文章

使浏览器窗口在任务栏中闪烁

FlashWindowEx FLASHW_STOP 仍然使任务栏保持颜色

如何使 JOptionPane 对话框在任务栏上显示为任务?

Electron应用在任务栏中创建闪烁窗口

如何使Delphi做的程序不显示在任务栏中

任务栏上没有显示Telerik RadWindow图标c#wpf [复制]