• ベストアンサー

点滅で知らせる方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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 メッセージの処理は非表示にしているウインドウ・プロシージャに  記述して下さい。 ・以上。

oldperson
質問者

お礼

たいへん丁寧に説明して頂きありがとうございます。 希望通りの処理ができるようになりました。 点滅しなかったのは、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 );

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

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

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

補足

丁寧に説明して頂きありがとうございます。 実際に試したところ、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)
回答No.1

★アドバイス ・ウインドウの点滅には 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?url=/library/ja/jpdebug/html/_win32_FlashWindowEx.asp

関連するQ&A