Rob*_*Rob 8 .net c# wpf .net-4.0 visual-studio-2010
我已经使用了从WPF窗口中删除图标中的代码来从应用程序的窗口中删除图标(使用附加的属性答案),这在通过Visual Studio 2010运行时起了作用.当应用程序正常运行时,仍会出现图标.
该窗口没有为其Icon属性分配图标,但应用程序确实在其属性(应用程序>资源>图标)中定义了一个图标,该图标显示为窗口图标.
如何解决这种行为差异,以便在Visual Studio 2010外部运行应用程序时不显示图标?
我做了一些挖掘;有一个StackOverflow 问题可以解决您的问题。讽刺的是,此修复仅在 Visual Studio 之外有效。
答案的相关部分(扎克·约翰逊):
看来WS_EX_DLGMODALFRAME只有当 WPF 窗口的本机 Win32 窗口没有与之关联的图标时才会删除该图标。WPF(方便地)使用应用程序的图标作为所有没有明确设置图标的窗口的默认图标。通常,这不会造成任何问题,并且省去了我们在每个窗口上手动设置应用程序图标的麻烦;然而,当我们尝试删除该图标时,它会给我们带来问题。
由于问题是WPF自动为我们设置窗口的图标,因此我们可以在应用时向Win32窗口发送WM_SETICONWS_EX_DLGMODALFRAME来重置其图标。
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);
Run Code Online (Sandbox Code Playgroud)
删除图标的代码:
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);
Run Code Online (Sandbox Code Playgroud)
仅当应用程序在 Visual Studio外部运行时它才有效。
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |