WPF ウィンドウのアイコンを非表示にする。


ウィンドウのアイコンを非表示にする方法です。
  


以下のサイトを参考に VB のコードに移植しました。

Remove Icon from WPF Window
How to remove the icon of a WPF window
WPF - remove system menu icon from modal window, but not main app window


開発環境は VB2008と VB2010、動作確認は XP/SP3・Windows7(X86) でしてます。以下サンプルコードです。

Option Explicit On
Option Strict On

Imports System.Runtime.InteropServices
Imports System.Windows.Interop

Public Class MainWindow

	<DllImport("user32.dll")> _
	Private Shared Function GetWindowLong(ByVal hwnd As IntPtr, ByVal index As Integer) As Integer
	End Function

	<DllImport("user32.dll")> _
	Private Shared Function SetWindowLong(ByVal hwnd As IntPtr, _
				  ByVal index As Integer, ByVal newStyle As Integer) As Integer
	End Function

	<DllImport("user32.dll")> _
	Private Shared Function SetWindowPos(ByVal hwnd As IntPtr, _
				 ByVal hwndInsertAfter As IntPtr, _
				 ByVal x As Integer, ByVal y As Integer, _
				 ByVal width As Integer, ByVal height As Integer, _
				 ByVal flags As UInteger) As Boolean
	End Function

	<DllImport("user32.dll")> _
	Private Shared Function SendMessage(ByVal hwnd As IntPtr, ByVal msg As UInteger, _
				ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
	End Function

	Const GWL_EXSTYLE As Integer = -20
	Const WS_EX_DLGMODALFRAME As Integer = &H1
	Const SWP_NOSIZE As Integer = &H1
	Const SWP_NOMOVE As Integer = &H2
	Const SWP_NOZORDER As Integer = &H4
	Const SWP_FRAMECHANGED As Integer = &H20
	Const WM_SETICON As UInteger = &H80

	Protected Overrides Sub OnSourceInitialized(ByVal e As System.EventArgs)

		MyBase.OnSourceInitialized(e)

		Dim hwnd = (New WindowInteropHelper(Me)).Handle
		Dim extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE)

		SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle Or WS_EX_DLGMODALFRAME)
		SendMessage(hwnd, WM_SETICON, CType(0, IntPtr), IntPtr.Zero)
		SendMessage(hwnd, WM_SETICON, CType(1, IntPtr), IntPtr.Zero)
		SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, 
				SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_FRAMECHANGED)

	End Sub

End Class


当初 Dan Rigsby のコードで実装したら XP も 7 もアイコン消えませんでした。で、stackoverflow.com の記事を参考にして SendMessage を加えたら見事にアイコン消えました。WindowStyle = ToolWindow でいいじゃんと思う人いるかも知れませんが、XP だとフレームの枠が細すぎてかっこ悪いんですよね。

ちなみにこのサンプルプログラム、実行させようとしたら AVG が警告出しました。なぜ?(^^;