我試圖在我的WinForms UI中顯示來自不同進程的系統菜單(包含最小化,還原等)。我知道我需要像GetSystemMenu和TrackPopupMenuEx這樣的interop調用,但是我沒能使它工作。有人可以提供一個示例代碼如何做到這一點?從另一個進程顯示系統菜單(使用WinForms,c#)
我發現(對WPF)這個代碼片段: Open another application's System Menu
我把它修改成這樣的:
const uint TPM_LEFTBUTTON = 0x0000;
const uint TPM_RETURNCMD = 0x0100;
const uint WM_SYSCOMMAND = 0x0112;
[DllImport("user32.dll")]
static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
static extern uint TrackPopupMenuEx(IntPtr hmenu, uint fuFlags, int x, int y, IntPtr hwnd, IntPtr lptpm);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public void ShowContextMenu()
{
IntPtr wMenu = GetSystemMenu(ExternalWindowHandle, false);
// Display the menu
uint command = TrackPopupMenuEx(wMenu, TPM_LEFTBUTTON | TPM_RETURNCMD, 10, 10, ExternalWindowHandle, IntPtr.Zero);
if (command == 0)
return;
PostMessage(ExternalWindowHandle, WM_SYSCOMMAND, new IntPtr(command), IntPtr.Zero);
}
正如在問題的標題所說,我不希望儘量減少一個窗口到系統托盤,我想顯示一個系統菜單從另一個進程(窗口)在我選擇的位置。幾乎和Windows任務欄一樣。任務欄(資源管理器)似乎可以在任務欄上右鍵單擊時顯示系統菜單。
感謝, 斯特凡
而你發佈的代碼是...? – Brian 2013-02-28 06:49:24
對不起,我錯過了提及,它不起作用。 TrackPopupMenuEx返回0. – 2013-02-28 07:27:32