44

ウィンドウアプリケーションがあります。別のアプリケーションで動作するようにタスクバーのウィンドウアプリケーションを最小化すると。あるウィンドウアプリケーションから別のウィンドウアプリケーションにメッセージを送信する機能があります。

したがって、最初のwinアプリケーションが最小化され、他のwinアプリケーションを開いて、最初のアプリケーションにメッセージを送信しますが、最初のアプリケーションはタスクバーにあります。したがって、メッセージが最初のアプリケーションをキャプチャすると、Skypeやメッセンジャーのように点滅するような機能が必要です。

FlashWindowExの方法を試しUser32.dllましたが、運がありません。「ウィンドウが前面に来るまで継続的にフラッシュする」オプションを使用して試してみました。しかし、運はありません。

例を挙げてこの問題を解決するのを手伝ってください。

4

4 に答える 4

38

以下に示すように、必要な参照を必ず追加してください。

using System.Runtime.InteropServices;
using Microsoft.Win32;

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

//Flash both the window caption and taskbar button.
//This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags. 
public const UInt32 FLASHW_ALL = 3;

// Flash continuously until the window comes to the foreground. 
public const UInt32 FLASHW_TIMERNOFG = 12;

[StructLayout(LayoutKind.Sequential)]
public struct FLASHWINFO
{
    public UInt32 cbSize;
    public IntPtr hwnd;
    public UInt32 dwFlags;
    public UInt32 uCount;
    public UInt32 dwTimeout;
}

// Do the flashing - this does not involve a raincoat.
public static bool FlashWindowEx(Form form)
{
    IntPtr hWnd = form.Handle;
    FLASHWINFO fInfo = new FLASHWINFO();

    fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
    fInfo.hwnd = hWnd;
    fInfo.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG;
    fInfo.uCount = UInt32.MaxValue;
    fInfo.dwTimeout = 0;

    return FlashWindowEx(ref fInfo);
}

これには、必要なものがすべて含まれている必要があります。

これが役立つことを願っています。

于 2012-07-03T11:45:28.873 に答える
33

C#: Win32 FlashWindowEx を介したタスクバーの Flash ウィンドウは、私にとってはうまくいきます。

Windows API (Win32) には、User32 ライブラリ内に FlashWindowEx メソッドがあります。このメソッドを使用すると、ユーザー (開発者) はウィンドウをフラッシュして、アプリケーション内で注意が必要な主要なイベントが発生したことをユーザーに通知できます。これの最も一般的な使用法は、ユーザーがアプリケーションにフォーカスを戻すまでウィンドウをフラッシュすることです。ただし、指定した回数だけウィンドウを点滅させることも、いつ停止するかを決定するまで点滅し続けることもできます。

ただし、FlashWindowEx メソッドの使用は、.NET Framework のどこにも組み込まれていません。これにアクセスするには、.NET の Platform Invoke (PInvoke) 機能を使用して Windows API (Win32) に「ドロップ」し、それを直接呼び出す必要があります。また、(.NET によって直接公開されていない) Windows API の他の多くの機能と同様に、.NET 内から Windows API を操作することに慣れていない場合、FlashWindowEx メソッドを使用するのは少し難しい場合があります。

ここで、PInvoke または Win32 FlashWindowEx メソッドの詳細に深く入り込むのではなく、このメソッドを簡単に利用できる C# の単純な静的クラスを以下に示します。PInvoke を使用して Windows API (Win32) を利用する方法を説明するには、実際にはかなりの情報が必要なので、今後の記事で取り上げる予定です。

この静的クラスの使用例を次に示します。

// One this to note with this example usage code, is the "this" keyword is referring to
// the current System.Windows.Forms.Form.

// Flash window until it recieves focus
FlashWindow.Flash(this);

// Flash window 5 times
FlashWindow.Flash(this, 5);

// Start Flashing "Indefinately"
FlashWindow.Start(this);

// Stop the "Indefinate" Flashing
FlashWindow.Stop(this);

FlashWindowEx メソッドについて注意すべきことの 1 つは、Windows 2000 以降が必要であり、かつ、Windows 2000 以降でのみ動作することです。

C# の静的クラスのコードは次のとおりです。

public static class FlashWindow
{
    [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="form">The Form (Window) to Flash.</param>
    /// <returns></returns>
    public static bool Flash(System.Windows.Forms.Form form)
    {
        // Make sure we're running under Windows 2000 or later
        if (Win2000OrLater)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL | FLASHW_TIMERNOFG, uint.MaxValue, 0);
            return FlashWindowEx(ref fi);
        }
        return false;
    }
 
    private static FLASHWINFO Create_FLASHWINFO(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="form">The Form (Window) to Flash.</param>
    /// <param name="count">The number of times to Flash.</param>
    /// <returns></returns>
    public static bool Flash(System.Windows.Forms.Form form, uint count)
    {
        if (Win2000OrLater)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL, count, 0);
            return FlashWindowEx(ref fi);
        }
        return false;
    }
 
    /// <summary>
    /// Start Flashing the specified Window (form)
    /// </summary>
    /// <param name="form">The Form (Window) to Flash.</param>
    /// <returns></returns>
    public static bool Start(System.Windows.Forms.Form form)
    {
        if (Win2000OrLater)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_ALL, uint.MaxValue, 0);
            return FlashWindowEx(ref fi);
        }
        return false;
    }
 
    /// <summary>
    /// Stop Flashing the specified Window (form)
    /// </summary>
    /// <param name="form"></param>
    /// <returns></returns>
    public static bool Stop(System.Windows.Forms.Form form)
    {
        if (Win2000OrLater)
        {
            FLASHWINFO fi = Create_FLASHWINFO(form.Handle, FLASHW_STOP, uint.MaxValue, 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 System.Environment.OSVersion.Version.Major >= 5; }
    }
}
于 2012-07-03T11:40:09.583 に答える