我正在使用C#/ WPF来创建一个应用程序。在该应用程序中,如果发生特定事件,我想闪烁窗口,以便该应用程序的用户知道发生了什么。我怎样才能在我的C#WPF应用程序中得到它。
就像在Yahoo Messenger中一样,如果你收到一条消息,那么消息窗口会闪烁以引起你的注意,我想在我的应用程序中使用该效果。
答案 0 :(得分:28)
以类似于IM通知的方式闪烁窗口和任务栏可以使用以下代码在WPF中完成。它使用PlatformInvoke使用WPF的FlashWindowEx
Application.Current.MainWindow
<强>代码强>
public class FlashWindowHelper
{
private IntPtr mainWindowHWnd;
private Application theApp;
public FlashWindowHelper(Application app)
{
this.theApp = app;
}
public void FlashApplicationWindow()
{
InitializeHandle();
Flash(this.mainWindowHWnd, 5);
}
public void StopFlashing()
{
InitializeHandle();
if (Win2000OrLater)
{
FLASHWINFO fi = CreateFlashInfoStruct(this.mainWindowHWnd, FLASHW_STOP, uint.MaxValue, 0);
FlashWindowEx(ref fi);
}
}
private void InitializeHandle()
{
if (this.mainWindowHWnd == IntPtr.Zero)
{
// Delayed creation of Main Window IntPtr as Application.Current passed in to ctor does not have the MainWindow set at that time
var mainWindow = this.theApp.MainWindow;
this.mainWindowHWnd = new System.Windows.Interop.WindowInteropHelper(mainWindow).Handle;
}
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FlashWindowEx(ref FLASHWINFO pwfi);
[StructLayout(LayoutKind.Sequential)]
private struct FLASHWINFO
{
/// <summary>
/// The size of the structure in bytes.
/// </summary>
public uint cbSize;
/// <summary>
/// A Handle to the Window to be Flashed. The window can be either opened or minimized.
/// </summary>
public IntPtr hwnd;
/// <summary>
/// The Flash Status.
/// </summary>
public uint dwFlags;
/// <summary>
/// The number of times to Flash the window.
/// </summary>
public uint uCount;
/// <summary>
/// The rate at which the Window is to be flashed, in milliseconds. If Zero, the function uses the default cursor blink rate.
/// </summary>
public uint dwTimeout;
}
/// <summary>
/// Stop flashing. The system restores the window to its original stae.
/// </summary>
public const uint FLASHW_STOP = 0;
/// <summary>
/// Flash the window caption.
/// </summary>
public const uint FLASHW_CAPTION = 1;
/// <summary>
/// Flash the taskbar button.
/// </summary>
public const uint FLASHW_TRAY = 2;
/// <summary>
/// Flash both the window caption and taskbar button.
/// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
/// </summary>
public const uint FLASHW_ALL = 3;
/// <summary>
/// Flash continuously, until the FLASHW_STOP flag is set.
/// </summary>
public const uint FLASHW_TIMER = 4;
/// <summary>
/// Flash continuously until the window comes to the foreground.
/// </summary>
public const uint FLASHW_TIMERNOFG = 12;
/// <summary>
/// Flash the spacified Window (Form) until it recieves focus.
/// </summary>
/// <param name="hwnd"></param>
/// <returns></returns>
public static bool Flash(IntPtr hwnd)
{
// Make sure we're running under Windows 2000 or later
if (Win2000OrLater)
{
FLASHWINFO fi = CreateFlashInfoStruct(hwnd, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0);
return FlashWindowEx(ref fi);
}
return false;
}
private static FLASHWINFO CreateFlashInfoStruct(IntPtr handle, uint flags, uint count, uint timeout)
{
FLASHWINFO fi = new FLASHWINFO();
fi.cbSize = Convert.ToUInt32(Marshal.SizeOf(fi));
fi.hwnd = handle;
fi.dwFlags = flags;
fi.uCount = count;
fi.dwTimeout = timeout;
return fi;
}
/// <summary>
/// Flash the specified Window (form) for the specified number of times
/// </summary>
/// <param name="hwnd">The handle of the Window to Flash.</param>
/// <param name="count">The number of times to Flash.</param>
/// <returns></returns>
public static bool Flash(IntPtr hwnd, uint count)
{
if (Win2000OrLater)
{
FLASHWINFO fi = CreateFlashInfoStruct(hwnd, FLASHW_ALL | FLASHW_TIMERNOFG, count, 0);
return FlashWindowEx(ref fi);
}
return false;
}
/// <summary>
/// A boolean value indicating whether the application is running on Windows 2000 or later.
/// </summary>
private static bool Win2000OrLater
{
get { return Environment.OSVersion.Version.Major >= 5; }
}
}
<强>用法强>
var helper = new FlashWindowHelper(Application.Current);
// Flashes the window and taskbar 5 times and stays solid
// colored until user focuses the main window
helper.FlashApplicationWindow();
// Cancels the flash at any time
helper.StopFlashing();
答案 1 :(得分:6)
您可以使用TaskBarItem课程使应用的任务栏图标闪烁。
以下是一些可以帮助您实现目标的资源:
- http://social.msdn.microsoft.com/Forums/en/wpf/thread/369bc5ee-a9a7-493f-978f-27a8ddedea06
- http://www.bobpowell.net/flashbar.htm
然后,您可以使用WPF动画flash,shake,fade-in fade-out或whatever one of the other zillion FX。 它非常简单,几乎不需要任何代码,如果你有Expression Blend,那么工作变得更加容易。
答案 2 :(得分:3)
将ProgressState
属性设置为TaskbarItemProgressState.Indeterminate
会使图标以绿色闪烁。您不必使用进度条。
http://msdn.microsoft.com/en-us/library/system.windows.shell.taskbaritemprogressstate.aspx