2011-11-08 21 views
2

私は、クライアントがWindowsメッセージの処理を続ける必要があるゲームに取り組んでいます。そうしないとゲームを悪用できます。ウィンドウのサイズ変更やドラッグイベント中のこの問題を解決するために、WM_TIMERというメッセージが50msごとに発生し、メインイベントループが再開されます。Windows上でマウスをクリックしているときにWM_TIMERメッセージが表示されないXボタン

問題は、ユーザーがウィンドウ付きクライアントのXボタンまたは最小化ボタンをクリックして保持しているときにこの手法が機能しないことです。私は、マウスを移動するまで何が続く

<00731> 00160D3C P WM_NCLBUTTONDOWN nHittest:HTCLOSE xPos:1150 yPos:178 
<00732> 00160D3C P WM_MOUSEMOVE fwKeys:MK_LBUTTON xPos:1014 yPos:-23 

、ノーWM_TIMER:(。だから、彼らはクリックを完了していない、彼らは単にクライアントを停止)

スパイ++を使用して、私が見る最後のメッセージです私がマウスボタンを離すまで、メッセージ。

質問は、私のマウスをウィンドウのXボタンの上に置いている間に、クライアントをもう一度動かすためにキーを押すことができますか?または私が "ウォッチドッグ" WM_TIMERメッセージを発射できるようにすることができますか?

答えて

4

システムメニュー(あなたの場合のような)やウィンドウのサイズ変更などの一部のシステムイベントは、通常のウィンドウメッセージがしばらく処理されないようにします。あなたのアーキテクチャを再考する必要があり、セカンダリスレッドで定期的な操作を実行する必要があります。ここでは、WaitForSingleObjectまたは単にメッセージベースのタイマーの代わりにSleep()を使用できます。

+0

これは多くの意味があります、ありがとうございます。 – Zyrca

3

私はいくつかの可能性を考えることができます。

  1. クライアント以外の領域でボタンが押された場合、ボタンが離されるまでシステムコードが独自のメッセージループを実行している可能性があります。このメッセージループは、WM_TIMERメッセージをディスパッチしないことがあります。

  2. WM_TIMERは、優先度が低いという点で特別だと思います。 WM_TIMERは、他に何も検索されない場合(WM_PAINTと同様の並べ替え)、キューからのみ取得されます。 Windowsのタイマーは最終的には起動し、指定した期間より早く起動することはありませんが、通常のハートビートが必要な場合は信頼性が低くなります。

別の人が示唆するように、別の人が提案するように、物事を生かし続けるためには2番目のスレッドに頼る必要があります。

0

定期的にwaitable timerを使用することを検討してください。独立したスレッドで独立して実行されます。

関連する問題