FlashWindowEx FLASHW_STOP はタスクバーの色を維持します
質問
マシンを制御するアプリケーションを開発しています。
マシンからエラーを受け取った場合、ユーザーはそれを直接認識できる必要があります。その方法の 1 つは、タスク バーのトレイを点滅させることです。マシンがエラーを解消すると、トレイの点滅が止まります。
FlashWindowEx 関数を使用すると、少し面倒な点が 1 つあります。ウィンドウの点滅を解除すると、ウィンドウが (私の場合は winXP) オレンジ色 (点滅しない) のままになります。
[Flags]
public enum FlashMode {
///
/// Stop flashing. The system restores the window to its original state.
///
FLASHW_STOP = 0,
///
/// Flash the window caption.
///
FLASHW_CAPTION = 1,
///
/// Flash the taskbar button.
///
FLASHW_TRAY = 2,
///
/// Flash both the window caption and taskbar button.
/// This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
///
FLASHW_ALL = 3,
///
/// Flash continuously, until the FLASHW_STOP flag is set.
///
FLASHW_TIMER = 4,
///
/// Flash continuously until the window comes to the foreground.
///
FLASHW_TIMERNOFG = 12
}
public static bool FlashWindowEx(IntPtr hWnd, FlashMode fm) {
FLASHWINFO fInfo = new FLASHWINFO();
fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
fInfo.hwnd = hWnd;
fInfo.dwFlags = (UInt32)fm;
fInfo.uCount = UInt32.MaxValue;
fInfo.dwTimeout = 0;
return FlashWindowEx(ref fInfo);
}
[StructLayout(LayoutKind.Sequential)]
public struct FLASHWINFO {
public UInt32 cbSize;
public IntPtr hwnd;
public UInt32 dwFlags;
public UInt32 uCount;
public UInt32 dwTimeout;
}
私の場合、フラッシュを開始するには FLASHW_TRAY を使用し、フラッシュを停止するには FLASHW_STOP を使用します。
何か間違ったことをしているのでしょうか、それともこれは WinXP の既知のバグであり、修正はありますか?
解決
ウィンドウが想定されている期間点滅を終了したときの動作は同じです。タスクバーボタンは色付きのままです。これはバグではないと思います。考えてみると、FLASHW_STOP を使用すると、実際には点滅が止まりますが、点滅の目的はユーザーの注意を引くことです。ユーザーがまだ下を向いて発見していない可能性があるため、ボタンは色付きのままです。 どれの ウィンドウは彼女の注意を引こうとしていた。ボタンの色を維持すると、その情報を利用できるようになります。
他のヒント
ここにエラーがあります:
fInfo.uCount = UInt32.MaxValue;
FLASHW_STOP パラメータを使用して呼び出す場合は、fInfo.uCount をゼロに設定する必要があります。そうしないと、タスク バー ボタンがアクティブなときに stop を呼び出そうとすると、アクティブなままになります。
ここで未定義の動作に関するメモを確認できます。http://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx
これが古い投稿であることは承知していますが、他の人がこの問題を迅速に解決するのに役立ちます。
外出していたため返信が遅くなり申し訳ありませんでした。
それが期待される機能である場合、それはあまり便利ではないと思いますが、少なくともリセットが必要です。
私は今それを使ってそれを修正しました FLASHW_ALL | FLASHW_TIMERNOFG
組み合わせ。
ところで、まだ十分な担当者がいないため、回答を評価できません。
点滅を停止するには、uCount を 0 に設定するだけです。