マウスカーソルがウィンドウ上に無いと処理が実行されない?

解決


Cherry  2008-12-28 12:27:54  No: 69344  IP: 192.*.*.*

初心者です。
WinMain関数内で無限ループして、100ループに一回フリーズしているウィンドウを探し、そのウィンドウにPostMessage()でWM_CLOSEを送信後、5秒以内に終了していなければTerminateProcessで殺す、というプログラムを作っているのですが、そのプログラムのメインウィンドウ上にマウスカーソルが無いと処理が実行されないようなんです。

試しに、同じようなソースで、20ループに一回IEをFindWindow()で探し、それに無条件でWM_CLOSEをPostする、というプログラムを作ってみたのですが、「IEを起動した時」が「処理を実行するループ」に偶然一致した場合、IEは想定していた通りに終了してくれるのですが、「処理を実行するループ」以外のループの時に起動してしまうと、思った通りに終了してくれません。
この場合でも、プログラムのメインウィンドウ上にマウスカーソルを持ってくと、その瞬間にIEが終了するのですが・・・・・・・・・。

長文になっちゃってすいません。


かなり困っています。
馬鹿馬鹿しい質問かもしれませんが、回答していただけたら嬉しいです。

編集 削除
瀬戸っぷ  2008-12-28 12:51:13  No: 69345  IP: 192.*.*.*

>WinMain関数内で無限ループして

どのように無限ループさせているのでしょう?
ウィンドウがある…ということでよろしいのでしょうか?
無限ループ部分のコードを掲示されたほうがよいかと。

# メッセージループなら、そのウィンドウ(正確にはスレッドか?)にメッージが来ないとGetMessage()で待機状態になったかと…

編集 削除
Cherry  2008-12-28 13:27:59  No: 69346  IP: 192.*.*.*

>># メッセージループなら、そのウィンドウ(正確にはスレッドか?)にメッセージが来ないとGetMessage()で待機状態になったかと…

すいません。メッセージループです。

メッセージが来ないと、っていうのはどういうことですか?詳しく教えて下さい。もしかして、グローバルフックでなんちゃらかんちゃら・・・ってことですか?
#馬鹿にしているのではありません。本気です。

編集 削除
瀬戸っぷ  2008-12-29 00:04:27  No: 69347  IP: 192.*.*.*

>メッセージが来ないと、っていうのはどういうことですか?

イベントドリブンですから、何らかのイベントが発生しないとメッセージループは駆動しません。
GetMessage()でメッセージキューに入ってくるまで待機してしまうので、
それでも回したければPeekMessage()を使用する…ようです。
ただし、それでも回すと…CPU使用率が跳ね上がる可能性がありますが。
Spy++でメッセージを監視していると、メッセージが飛んでこないことがあるのがわかるかと。
ウィンドウ上にマウスカーソルがあると、定期的にOSからのメッセージが飛んできます。

メッセージの種類を問わないのであれば、SetTimer()辺りで適当なタイマーを設定すればWM_TIMERメッセージが飛んでくるでょう。

編集 削除
Cherry  2008-12-29 01:47:21  No: 69348  IP: 192.*.*.*

なるほど。よく分かりました。早速やってみます♪

編集 削除