- ベストアンサー
点滅で知らせる方法
非表示の常駐プログラムで、ある状況を検出したときに ウィンドウを非アクティブの最小化状態で表示し、 そのタスクバー上のアイコンを点滅させて知らせたい。 ただし、現在アクティブになっているウィンドウはそのまま キー入力などの操作ができる状態にしておきたい。 どのようなWindowsAPIを使用すればできるでしょうか。 OSはWindowsXPです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・点滅させるときは、非表示のウインドウ・プロシージャを一度表示するようにします。 その後、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 メッセージの処理は非表示にしているウインドウ・プロシージャに 記述して下さい。 ・以上。
その他の回答 (2)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★訂正。 ・定数を間違っていました。 間違い⇒FLASHW_CAPTION 正しい⇒FLASH_TRAY ・下の『参考URL』もどうぞ。
補足
丁寧に説明して頂きありがとうございます。 実際に試したところ、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);
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・ウインドウの点滅には 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 でウインドウを自動的に 閉じる仕組みをとれば、数秒間だけ点滅して自動的に消えるようにも出来ます。 ・もしずっと点滅させたい場合はどのタイミングで点滅用の『タスクアイコン』を消すのかを 考えて下さい。 ・以上。
お礼
たいへん丁寧に説明して頂きありがとうございます。 希望通りの処理ができるようになりました。 点滅しなかったのは、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 );