「今後このダイアログボックスを表示しない」付きダイアログを呼び出す


よく色んなアプリケーションで 「今後このダイアログボックスを表示しない」 チェックボックス付きメッセージボックスを見かけますが、どうやって実装してるんだろうと前から思ってました。実に様々なソフトで見かけるので OS が何らかの API を提供してるに違いないと思って調べてたら、見つかりました。SHMessageBoxCheck function を使えばいいのだそうな。


VB.NET の場合、DllImport を使えば簡単に呼び出せるので、モジュールに SHMessageBoxCheck 関数の宣言とパラメータで使う列挙体を用意しとけばいいです。

Imports System.Runtime.InteropServices

Public Module WindowsSDK

	Public Enum MessageBoxCheckFlags
		MB_OK = &H0&
		MB_OKCANCEL = &H1&
		MB_YESNO = &H4&
		MB_ICONHAND = &H10&
		MB_ICONQUESTION = &H20&
		MB_ICONEXCLAMATION = &H30&
		MB_ICONINFORMATION = &H40&
	End Enum

	' EntryPoint="#185" の指定は XP の場合絶対必要。Vista・7 はなくても動作するが、あっても正常動作は確認済み。
	<DllImport("shlwapi.dll", EntryPoint:="#185")>
	Public Function SHMessageBoxCheck(
		hwnd As IntPtr, text As String, title As String,
		uType As UInt32, iDefault As Integer, regVal As String) As Integer
	End Function

End Module


で、呼び出すときはこんな感じ。

Private Sub Message()
	SHMessageBoxCheck(
		IntPtr.Zero,
		"これはチェックボックス付ダイアログです。" + vbCrLf +
		"次回から表示したくない場合、下のチェックボックスをONにしてください。",
		"チェックボックス付きダイアログ", 
		MessageBoxCheckFlags.MB_OK, 0, "テスト"
	)
End Sub


するとこうなる。


チェックボックスをONにすると、以下のキーに引数 regVal で指定した REG_SZ 値が作成され、データに NO が設定されます。再度表示するには値を削除すればいいです。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain


.NET のレジストリ操作方法は以下の記事を参考にしてください。

関連記事: レジストリの操作


#レジストリの操作はくれぐれもご注意を m(_ _)m