リストビューの拡張スタイルにLVS_EX_CHECKBOXESを指定する必要があります。拡張スタイルの設定を行うには、ListView_SetExtendedListViewStyleExを呼び出します。dwExStyle);hwndLVは、リストビューのハンドルを指定します。dwExMaskは、変更したい拡張スタイルを表す定数を指定します。dwExStyleは、dwExMaskに指定したスタイルをどうするかを指定します。0を指定すればdwExMaskのスタイルは取り除かれます。このマクロを呼び出す場合は以下のように処理が多くなります。それによって既存の拡張スタイルを上書きしてしまうからです。それにLVS_EX_CHECKBOXESを組み合わせるようにしています。変更したい拡張スタイルのみを対象にすることができます。ListView_GetCheckStateを呼び出します。iIndex);hwndLVは、リストビューのハンドルを指定します。iIndexは、チェックを確認したいアイテムのインデックスを指定します。今回のプログラムは、リストビューのアイテムにチェックボックスを表示します。lParam);}特定の状況にて、チェックの確認をしたい場合は特に複雑なことはありません。その押下時にListView_GetCheckStateを呼び出せばよいだけです。チェックが入った瞬間を特定したいような場合は、少し処理が複雑なことになります。チェックが入ったときに送られる通知メッセージは存在しないからです。したがって、やや強引な方法で判定を行うことになります。考え方としては、アイテムのクリックを検出し、その位置がチェックボックスに相当するかどうかです。NM_CLICK、NM_RCLICK(右クリック)、NM_DBLCLK(ダブルクリック)があるため、まずこれらを検出します。このためにはクリックされた座標をLVHITTESTINFO.ptに格納しておく必要があります。これは、GetCursorPosで現在のカーソルの位置を取得し、それをScreenToClientでクライアント座標に変換すればよいでしょう。LVHT_ONITEMSTATEICONが含まれる場合は、チェックボックスの箇所をクリックしたことになります。チェック確認の前にデフォルト処理が実行される必要があります。このメッセージ内ならばチェックの状態を正しく確認できます。Enterキーを押すことでアイテムをチェックできるようになっています。この瞬間を特定するためには、Spaceキーが押されたことを通知するLVN_KEYDOWNを検出すればよいでしょう。ListView_GetItemStateを呼び出すことで、選択されたアイテムのインデックスを求めます。先のクリックの例と同じようにチェックの確認ができます。