Biraz kazımak yaptım; Sorununuzu ele alan bir StackOverflow question var. İronik olarak, bu düzeltme yalnızca Visual Studio'nun dışında çalışır. (Zach Johnson tarafından) Yanıtla
İlgili Parçaları:
Bu WPF pencerenin yerel Win32 penceresi kendisiyle ilişkilendirilmiş bir simge sahip olmadığında WS_EX_DLGMODALFRAME
simgenin yalnızca kaldırır anlaşılmaktadır. WPF (uygun şekilde), uygulamanın simgesini açıkça belirlenmiş bir simge olmaksızın tüm pencereler için varsayılan simge olarak kullanır. Normalde, bu herhangi bir soruna neden olmaz ve her bir pencerede uygulamanın simgesini manuel olarak ayarlama zorluğunu azaltır; Ancak, simgeyi kaldırmaya çalıştığımızda bu bizim için bir soruna neden olur.
Sorun, WPF'nin bizim için pencere simgesini otomatik olarak ayarlaması olduğundan, WS_EX_DLGMODALFRAME
uygularken simgeyi sıfırlamak için Win32 penceresine WM_SETICON gönderebiliriz.
IntPtr hWnd = new WindowInteropHelper(window).Handle;
int currentStyle = NativeMethods.GetWindowLongPtr(hWnd, GWL_EXSTYLE);
SetWindowLongPtr(
hWnd,
GWL_EXSTYLE,
currentStyle | WS_EX_DLGMODALFRAME);
// reset the icon, both calls important
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_SMALL, IntPtr.Zero);
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_BIG, IntPtr.Zero);
SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
Bu uygulama, Visual Studio dışında çalıştırmak olduğunda çalışır:
const int WM_SETICON = 0x0080;
const int ICON_SMALL = 0;
const int ICON_BIG = 1;
[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr SendMessage(
IntPtr hWnd,
int msg,
IntPtr wParam,
IntPtr lParam);
Kod simgesini kaldırın.
Simgeyi kaldırmak için küçük bir WPF uygulamasının MainWindow'unda başvurulan yanıttaki kodu kullandım. Visual Studio'da ve projemin Bin \ Debug klasöründen çalıştırıldığında çalışır. Bunu etkileyebilecek başka küçük detaylar var mı? –