簡體   English   中英

WPF - 從模態窗口中刪除系統菜單圖標,但不是主應用程序窗口

[英]WPF - remove system menu icon from modal window, but not main app window

我正在嘗試(在WPF中):

  1. 有一個.exe文件,顯示系統菜單圖標(窗口左上角的圖標),就像正常一樣
  2. 沒有此圖標顯示在此應用程序調用的模態窗口中

我在這里嘗試了解決方案: 從WPF窗口中刪除Icon

這很有效。 http://blogs.msdn.com/b/wpfsdk/archive/2007/08/02/a-wpf-window-without-an-window-icon-the-thing-上有一個可下載的相同內容的樣本: 你點擊到得最系統menu.aspx

但是,如果我將.ico文件添加到.exe的項目屬性(屬性 - >應用程序 - >圖標和清單),它將停止工作。 您可以使用可下載的示例嘗試此操作。

似乎.exe中的圖標也用在模態窗口中(我們在.dll文件中也有),即使該.dll的屬性顯示為“默認圖標”。 它必須從.exe傳遞下來。 那么,有沒有辦法在主窗口上顯示圖標,而不是在子窗口上?

可能更簡單的方法是:即使項目的屬性中指定了.ico文件,是否可以刪除圖標?

我發現唯一能工作的是將模態窗口的WindowStye設置為“ToolWindow”。 這給了我幾乎我想要的東西:沒有圖標和“關閉”按鈕(右上角的“x”)仍然存在。 然而,x是超小的。 這是最好的嗎?

謝謝你的幫助。

我有同樣的問題。 當WPF窗口的本機Win32窗口沒有與之關聯的圖標時, WS_EX_DLGMODALFRAME似乎只刪除圖標。 WPF(方便地)使用應用程序的圖標作為所有窗口的默認圖標,沒有明確設置的圖標。 通常情況下,這不會導致任何問題,並且可以省去在每個窗口上手動設置應用程序圖標的麻煩。 但是,當我們嘗試刪除圖標時,它會給我們帶來問題。

既然問題是,WPF自動設置窗口的圖標對於我們來說,我們可以發送WM_SETICON對Win32窗口時,我們正在申請重置其圖標WS_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);

用於刪除圖標的代碼:

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);

編輯:哦,看起來這只有在應用程序 Visual Studio 外部運行時才有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM