获取特定任务栏按钮的上下文菜单文本

3
我有一些代码可以使用User32.SendMessage和TB_GETBUTTON消息从Windows任务栏中获取任务栏按钮及其文本的TBBUTTON结构(通过C# P/Invokes调用Win32 API)。但我正在尝试找出如何在获得按钮句柄后,抓取相关联的上下文菜单文本。有一些特定应用程序的状态信息在那里,我想要检索它。按钮文本可以帮助我获得其中一些内容,但我需要上下文菜单文本来完成它。
有什么想法吗?
1个回答

7
这段话有些不太清楚... 上下文菜单没有文本,但它们有菜单项,每个菜单项都会有文本。通过“上下文菜单文本”,您是指任务栏按钮弹出/上下文菜单中的菜单项文本吗?例如,下面截图中的“还原”、“最小化”等?
如果是的话,我怀疑您的方法不正确:
1.这个菜单并不属于按钮,而是由任务栏按钮代表的窗口的系统菜单。如果按钮有一个上下文菜单,那么这可能是为了一组分组的窗口,而不是一个特定的窗口(甚至是同一个进程的窗口)。
2.基于窗口的上下文菜单来判断似乎是一个不可靠的方法,特别是基于文本,因为这将根据用户所在的位置而改变。应用程序也可以更改此菜单的内容,因此无法保证它将包含您期望出现的内容。最好检查窗口样式是否最小化等,以获取影响菜单内容的信息。
根据问题需要的内容,我将回答基于您需求的问题,而不是直接回答您提出的问题,因为(a)按照要求不可能回答(b)我认为您试图做其他事情。通常,在问题中,声明为什么要做某事很重要,甚至可以询问这一点,即“如何实现X”,以防使用的方法不太好。在这里,X是“查找有关此窗口的信息”,而不是“获取上下文菜单的文本”,因为那只是获得X的可能方法之一。此外,我认为从资源管理器(任务栏是资源管理器窗口)等第三方应用程序的内部提取数据是脆弱且容易在未来的Windows版本中断掉。
系统菜单或窗口信息(无论哪一个)都属于应用程序窗口。除非任务栏按钮被分组(然后是子项),否则每个任务栏按钮对应于系统中的一个特定窗口。所以您想要做的是找到这些窗口。您可以通过以下方式来实现:

这些窗口中的每一个都是应该显示在任务栏、Alt-Tab对话框等地方的窗口。

你说你正在获取任务栏按钮的文本 - 这可能是窗口的标题,而GetWindowText是从另一个进程中获取窗口标题的规范(即:可能更可靠)的方法。

如果你真的想要弹出菜单,那么:

  • 使用GetSystemMenu获取窗口的系统菜单句柄。应用程序可以自定义此内容,因此如果您的应用程序正在这样做(这就是您想要弹出菜单的原因),请确保将false传递给bRevert参数。
  • 然后,您可以使用GetMenuItemCount获取菜单项数目,并为每个菜单项调用GetMenuItemInfo以获取有关每个菜单项的信息。将true传递给fByPosition参数,表示您正在按位置访问菜单(因为您知道计数,所以您获取的是项目0、1、2...计数-1)。

    • 这会填充一个MENUITEMINFO结构,该结构(我认为,我从未编写过此代码,因此我没有进行过测试)将通过fMask成员中设置了MIIM_STRING标志的dwTypeData字段“告诉您与项目相关联的文本”。

如果您真的想要有关窗口状态的信息,则可以使用诸如IsIconic之类的方法查看它是否已最小化,再次使用GetWindowLong获取其他信息等。我建议您就如何获取有关窗口的任何特定信息提出另一个SO问题以获取详细信息。

希望这可以帮助!


1
@Adam:自从我回答以来已经过去一周了……有帮助吗?还有什么可以补充的吗? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接