You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TrackPopupMenu在64位桌面应用中无法显示的问题排查

问题分析与解决方案

核心原因:P/Invoke参数类型不匹配

你的问题根源在于TrackPopupMenu的DllImport参数定义不符合Windows API规范,导致64位环境下参数栈传递混乱,最终解析出无效窗口句柄(ERROR_INVALID_WINDOW_HANDLE)。

原方法定义中最后一个参数ushort Param7完全错误:

[DllImport("user32.dll",SetLastError = true, EntryPoint = "TrackPopupMenu", CharSet = CharSet.Ansi)]
public static extern bool TrackPopupMenu(uint Param1, uint Param2, int Param3, int Param4, int Param5, IntPtr Param6, ushort Param7);

根据Windows官方文档,TrackPopupMenu的最后一个参数是LPRECT类型(指向RECT结构体的指针),对应C#中的IntPtr类型。32位系统中IntPtr为4字节,ushort为2字节,可能因内存填充巧合未触发错误;但64位系统中IntPtr是8字节,ushort仅2字节,会导致参数栈对齐错误,Param6(窗口句柄)被后续错误数据覆盖,从而报无效窗口句柄。

修正方案

替换为符合API规范的P/Invoke定义:

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool TrackPopupMenu(
    IntPtr hMenu,
    uint uFlags,
    int x,
    int y,
    int nReserved,
    IntPtr hWnd,
    IntPtr prcRect
);

调用注意事项:

  • 若不需要限制菜单显示区域,prcRect传递IntPtr.Zero即可
  • 确保hWnd参数传递的是有效窗口句柄(比如WinForms中this.Handle,WPF中可通过WindowInteropHelper获取)

额外验证

如果之前用TrackPopupMenuEx也报错,大概率是同样的参数类型错误问题,按上述规则修正TrackPopupMenuEx的参数定义即可解决。

内容的提问来源于stack exchange,提问作者Mlad3n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:42:18