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 が警告出しました。なぜ?(^^;