DispatchMessage

DispatchMessageは、GetMessageで取得したウィンドウメッセージをウィンドウプロシージャに送出するWindowsAPI・・・。

DispatchMessage 関数

引数には送出するメッセージの入ったMSG構造体変数のアドレスを指定する・・・。
ウィンドウメッセージに対する各処理は、基本的にウィンドウプロシージャと呼ばれるコールバック関数で行うため、そこにメッセージを送出する必要がある・・・。
DispatchMessageによる送出が行われないと、連続する次のメッセージの処理につながらないため、正常なイベント処理が行われない・・・。
そのため、メッセージループにはGetMessageとDispatchMessageが必要・・・。

メッセージループを見てみよう・・・。

DispatchMessageを追加している・・・。
実は、RegisterClassの頁で、閉じるボタンや最小化ボタンが機能しなかったのは、これがなかったからともいえる・・・。

f:id:BG1:20150307233227p:plain

閉じるボタンを押された時のイベントが来たとしても、ウィンドウプロシージャ(ここの場合はDefWindowProc)への送出とその後の処理が続かなければ、ウィンドウが閉じられない・・・。

今回は、非クライアント領域が押されたとき(WM_NCLBUTTONDOWN)かつ、それが閉じるボタン上(HTCLOSE)のときに、breakするようにしている・・・。
この条件だと、閉じるボタンに対する処理がちゃんとなされることがわかったのでこうしている・・・。
(ただ、これも正しい方法ではないので注意!)

で実行しようとしたが、

f:id:BG1:20150307235347p:plain

"patch"という文字列が実行ファイル名に含まれているために、管理者権限が必要になってしまっている・・・。
そこで、

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
	<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
		<security>
			<requestedPrivileges>
				<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
			</requestedPrivileges>
		</security>
	</trustInfo>
</assembly>

というapp.manifestファイルを、プロジェクトファイル(.vcproj)と同じところに置く・・・。
そして、[追加のマニフェストファイル]に指定する・・・。

f:id:BG1:20150307235935p:plain

でビルドして実行・・・。

f:id:BG1:20150308000152p:plain

閉じるボタンでちゃんと閉じれる・・・。

Sample/DispatchMessage.cpp at master · bg1bgst333/Sample · GitHub