我试图在我的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