2009-09-22 40 views
3

任務欄中不顯示窗口,只在系統托盤中顯示。我怎樣才能讓它出現在任務欄中呢?如何使窗口出現在任務欄中?

我嘗試下面的代碼,但它沒有任何效果:

int windowStyle = GetWindowLong(pMainWindow, GWL_EXSTYLE); 
SetWindowLong(pMainWindow, GWL_EXSTYLE, windowStyle & WS_EX_TOOLWINDOW); 

而且,這不是我的表格!我碰到Process.GetProcessesByName手柄,我不知道如何訪問Form類的屬性:

Process[] processes = Process.GetProcessesByName("somename"); 
someProcess = processes[0]; 

pMainWindow = someProcess.MainWindowHandle; 

回答

2

下,似乎這樣的伎倆。如果您在調用SetWindowLong之後隱藏&重新顯示窗口,它將顯示在任務欄中。

我竭力要找到一種方式,一旦被最小化窗口從任務欄刪除...

[DllImport("User32.Dll")]     
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

private const int SW_HIDE = 0x00; 
private const int SW_SHOW = 0x05; 

private const int WS_EX_APPWINDOW = 0x40000; 
private const int GWL_EXSTYLE = -0x14; 

private void ShowWindowInTaskbar(IntPtr pMainWindow) 
{      
    SetWindowLong(pMainWindow, GWL_EXSTYLE, WS_EX_APPWINDOW); 

    ShowWindow(pMainWindow, SW_HIDE); 
    ShowWindow(pMainWindow, SW_SHOW);  
} 
+0

OH YEAH! 非常感謝! –

+0

很酷沒問題。如果您正在通過系統托盤AKA通知圖標最大化窗口,請記住,當用戶最小化窗口時,他們會*希望將其從任務欄中刪除。正如我在我的回答中所說的,我無法讓這一點工作... – ParmesanCodice

+0

我認爲這是有點錯誤的,例如,假設窗口是最頂層的窗口,這將清除「WS_EX_TOPMOST」標誌。你還需要使用'GetWindowLong'和'''。 –

0

設置窗體的.ShowInTaskbar屬性爲true。

+0

對不起,我沒給你所有的信息。這不是我的表格 –

-1

您可以將返回的Process.GetProcessesByName()對象轉換爲表單,然後設置其.ShowInTaskbar屬性?

+0

我該怎麼辦? –

+0

類似... Object O = new Object(); O = Process.GetProcessesByName(); ((Form)O).ShowInTaskBar = true; –

+0

不,這不起作用 –

2

通過WS_EX_APPWINDOW而不是WS_EX_TOOLWINDOW。 From the docs

WS_EX_APPWINDOW:當窗口可見時,強制在任務欄上放置頂層窗口。

WS_EX_TOOLWINDOW:...工具窗口不會出現在任務欄或當用戶按下ALT + TAB在出現的對話框中...

+0

謝謝!嘗試了SetWindowLong(pMainWindow,GWL_EXSTYLE,windowStyle和WS_EX_APPWINDOW);和SetWindowLong(pMainWindow,GWL_EXSTYLE,windowStyle&WS_EX_APPWINDOW);但沒有任何結果。雖然我發現「只是設置擴展窗口樣式本身是不夠的 - 它只能在窗口初始化時正常工作」,也許這是一個問題 –

+0

...有一個解決方案,使應用程序窗口是我們要編輯的窗口的父窗口。但我的應用程序沒有窗口,這是一個DLL! –

+0

對不起,&和| –