代码之家  ›  专栏  ›  技术社区  ›  Stewart

user32.dll flashwindow的托管替代项

  •  3
  • Stewart  · 技术社区  · 16 年前

    在.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应用程序正在更新,以便在Linux/Mac OS X上使用Mono完全运行。 有没有办法构造一个与flashwindow或flashwindowex等效的托管窗口?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Roger Lipscombe    13 年前

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

    如果用户要做的唯一事情是 激活程序、阅读消息或查看状态更改。

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

    如果你真的想做类似于闪烁窗口图标的事情,那么在OSX上的等价物将是一个跳跃的停靠图标(同样,人们 don't like this )我不知道那是不是被可可包着。

    在Linux中,由于许多框架根本没有任务栏概念,因此行为又是分散的,您应该能够很好地处理所处的任何框架。

        2
  •  2
  •   Michael A. McCloskey    16 年前

    对于您想要做的事情,没有管理的等价物。在不讨论这是否是一个好主意的情况下,有几个想法浮现在脑海中,没有一个像flashwindow调用那样优雅和简单。

    1. 使用计时器切换窗体的可见性。这将导致从任务栏中完全添加/删除表单,但会引起注意。

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

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

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