我试图在我的 WinForms UI 中显示来自不同进程的系统菜单(包含最小化、还原等)。我知道我需要像 GetSystemMenu 和 TrackPopupMenuEx 这样的互操作调用,但我没有让它工作。有人可以提供示例代码怎么做吗?
我找到了这个代码片段(用于 WPF): 打开另一个应用程序的系统菜单
我把它修改成这样:
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任务栏一样。当您在任务栏上右键单击它时,任务栏(资源管理器)似乎能够显示系统菜单。
谢谢,斯特凡