user32.dll FlashWindow的托管替代方案

时间:2009-07-27 09:36:56

标签: .net winapi mono pinvoke

在闪烁标题栏和窗口相应任务栏按钮的.Net应用程序中,为了吸引用户的注意,使用了类似这样的P / Invoke代码:

[DllImport("user32.dll")]
private static extern bool FlashWindow(IntPtr hwnd, bool bInvert);

public static void FlashWindow(System.Windows.Forms.Form window)
{
  FlashWindow(window.Handle, false);
}

如何在不使用P / Invokes的情况下触发相同的效果?具体来说,.Net应用程序正在更新,以便在具有Mono的Linux / Mac OS X上完全运行。 有没有办法构建与FlashWindow或FlashWindowEx相当的托管?

2 个答案:

答案 0 :(得分:3)

你应该注意到微软自己的UI guidelines建议你不要这样做,除非事件确实需要立即注意。

  

如果用户必须做的事情是,请不要闪烁任务栏按钮   激活程序,阅读消息或查看状态变化。

强烈建议,即使在跨平台应用程序中,也要遵循当前系统的UI准则 在这种情况下,它取决于你想要做什么但是猜测:

如果你确实想要做相当于Flashing窗口的图标,那么OS X上的等效图标将是一个弹跳停靠图标(再次,人们don't like this)。我不知道它是否被可可#包裹。

在Linux中,行为再次碎片化,因为许多框架根本就没有任务栏概念,并且您可以很好地使用您所使用的任何框架。

答案 1 :(得分:2)

没有您想要的管理对应物。在没有进入关于这是否是一个好主意的辩论中,我想到了一些想法,其中没有一个像FlashWindow一样优雅和简单。

  1. 使用计时器切换表单的可见性。这必须从任务栏中完全添加/删除表单,但会被注意到。

  2. 使用计时器切换表单的窗口状态(最小化/正常)。这也会让你注意到,但也许不是很好。

  3. 创建一个单独的空白表单,ShowInTaskbar设置为false,不透明度为0.然后使用计时器交替激活空白表单和主表单。这将闪烁主窗体的标题栏,但不会影响任务栏表示,因为另一个应用程序没有获得输入焦点。

  4. 免责声明:我不知道这些是如何在非Windows操作系统上运行的,但我只是为了管理替代方案而提供它们。