プロが教える店舗&オフィスのセキュリティ対策術

非表示の常駐プログラムで、ある状況を検出したときに
ウィンドウを非アクティブの最小化状態で表示し、
そのタスクバー上のアイコンを点滅させて知らせたい。
ただし、現在アクティブになっているウィンドウはそのまま
キー入力などの操作ができる状態にしておきたい。

どのようなWindowsAPIを使用すればできるでしょうか。

OSはWindowsXPです。

A 回答 (3件)

★アドバイス


・ウインドウの点滅には FlashWindow()か、FlashWindowEx() を利用します。
 FlashWindow() は1回だけの点滅ですが、FlashWindowEx() は複数回の点滅を
 簡単に行えます。
・あと非表示の常駐プログラムなので、点滅用のウインドウを作成して最小化で表示を
 行います。このとき、非アクティブで最小化する指定にします。そして点滅用の
 ウインドウ・プロシージャの WM_CREATE で FlashWindowEx() 関数を実行するだけで
 良いでしょう。
・下にサンプルのを載せておきます。

サンプル:
FLASHWINFO pfwi;

// 3秒間に3回の点滅(1秒に1回点滅×3回)
pfwi.cbSize = sizeof( FLASHWINFO );
pfwi.hWnd = hWnd; // ウインドウ・ハンドル
pfwi.uCount = 3; // 点滅回数
pfwi.dwTimeout = 500; // 点滅間隔(ms)
pfwi.dwFlags = FLASHW_CAPTION;

FlashWindowEx( &pfwi ); // 点滅

その他:
・点滅の終わる時間を予め SetTimer() で設定して WM_TIMER でウインドウを自動的に
 閉じる仕組みをとれば、数秒間だけ点滅して自動的に消えるようにも出来ます。
・もしずっと点滅させたい場合はどのタイミングで点滅用の『タスクアイコン』を消すのかを
 考えて下さい。
・以上。

参考URL:http://msdn.microsoft.com/library/ja/default.asp …
    • good
    • 0

★訂正。


・定数を間違っていました。
 間違い⇒FLASHW_CAPTION
 正しい⇒FLASH_TRAY
・下の『参考URL』もどうぞ。

参考URL:http://www.alato.ne.jp/kazu-/vb/tip13.htm

この回答への補足

丁寧に説明して頂きありがとうございます。

実際に試したところ、FlashWindowはうまく点滅しましたが、
FlashWindowExでは、点滅しませんでした
(FlashWindowExを実行しなかった時とはウィンドウの状態が違っている)。

念のため、リストを表示します。

FLASHWINFO pfwi;
HWND hwnd = CreateWindow( "STATIC", "お知らせ", WS_MINIMIZE | WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND)NULL, (HMENU)NULL,
hInstance, NULL);
pfwi.cbSize = sizeof( FLASHWINFO );
pfwi.hwnd = hwnd;
pfwi.dwFlags = FLASHW_TRAY;
pfwi.uCount = 10;
pfwi.dwTimeout = 500;
FlashWindowEx( &pfwi );
Sleep( 10000 );
DestroyWindow(hwnd);

補足日時:2007/06/14 15:23
    • good
    • 0

★アドバイス


・点滅させるときは、非表示のウインドウ・プロシージャを一度表示するようにします。
 その後、FlashWindowEx() 関数で点滅の指示を出して 10 秒後に非表示にします。
・下にサンプルを載せます。

サンプル:
#define TID_CLOCK (12345) // タイマーID
#define TID_CYCLE (10000) // タイマー間隔(10秒)

void SetFlash( hWnd ) ←非表示のウインドウ・ハンドルを渡す
{
 FLASHWINFO pfwi;
 
 // 10秒間に10回の点滅(1秒に1回点滅×10回)
 pfwi.cbSize = sizeof( FLASHWINFO );
 pfwi.hwnd = hWnd;// ウインドウ・ハンドル
 pfwi.uCount = 10;// 点滅回数
 pfwi.dwTimeout = 500;// 点滅間隔(ms)
 pfwi.dwFlags = FLASHW_TRAY;
 FlashWindowEx( &pfwi );// 点滅
 SetTimer( hWnd, TID_CLOCK, TID_CYCLE, NULL );
 ShowWindow( hWnd, SW_SHOW );
  ↑
 非表示ウインドウを表示
}

case WM_TIMER:
 タイマー部で非表示ウインドウを非表示に戻す
  ↓
 ShowWindow( hWnd, SW_HIDE );
 KillTimer( hWnd, TID_CLOCK );
 break;

最後に:
・非表示のウインドウは起動時に最小化しておきます。
 ウインドウを作成するときに SW_SHOWMINNOACTIVE か、SW_MINIMIZE の定数にします。
・点滅させたいときは上記のサンプルにある SetFlash() 関数を呼んで下さい。
 呼ばれると 10 秒間だけ点滅してその後に WM_TIMER で非表示となり消える仕組みです。
 あと設定したタイマーも KillTimer() 関数で破棄します。
・なお、WM_TIMER メッセージの処理は非表示にしているウインドウ・プロシージャに
 記述して下さい。
・以上。
    • good
    • 0
この回答へのお礼

たいへん丁寧に説明して頂きありがとうございます。

希望通りの処理ができるようになりました。

点滅しなかったのは、Sleepで簡単にテストしたのが原因でした。
メッセージ処理をしないとだめなのですね。

また、「タスクバーを自動的に隠す」にしておいても、
点滅時にタスクバーを表示してくれるので助かります。

参考までに、ソースを載せておきます。

FLASHWINFO pfwi;
pfwi.cbSize = sizeof( FLASHWINFO );
pfwi.hwnd = hwnd;
pfwi.dwFlags = FLASHW_TRAY | FLASHW_TIMERNOFG;
pfwi.uCount = 0;
pfwi.dwTimeout = 0;
FlashWindowEx( &pfwi );
ShowWindow( hwnd, SW_MINIMIZE );

お礼日時:2007/06/15 11:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!