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

解決


Cherry  2008-12-28 21:27:54  No: 69344

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

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

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

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


瀬戸っぷ  2008-12-28 21:51:13  No: 69345

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

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

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


Cherry  2008-12-28 22:27:59  No: 69346

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

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

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


瀬戸っぷ  2008-12-29 09:04:27  No: 69347

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

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

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


Cherry  2008-12-29 10:47:21  No: 69348

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加