获取特定任务栏按钮的上下文菜单文本
Posted
技术标签:
【中文标题】获取特定任务栏按钮的上下文菜单文本【英文标题】:Get Context Menu text of specific TaskBar button 【发布时间】:2011-06-21 18:03:41 【问题描述】:我有一些代码使用带有 TB_GETBUTTON 消息的 User32.SendMessage 从 Windows 任务栏中获取任务栏按钮及其文本,以检索 TBBUTTON 结构(通过 C# P/Invokes 的 Win32 API)。但是我试图弄清楚如何,一旦我有了按钮的句柄,就可以获取相关的上下文菜单文本。对于我想检索的特定应用程序,那里有一些状态信息。按钮文本让我明白了一些,但我需要上下文菜单文本来完成它。
有什么想法吗?
【问题讨论】:
【参考方案1】:这并不完全清楚......上下文菜单没有文本,因此 - 它们有菜单项,每个菜单项都有文本。 “上下文菜单文本”是指任务栏按钮的弹出/上下文菜单中菜单项的文本吗?比如下面截图中的“还原”、“最小化”等?
如果是这样,我怀疑你的做法是错误的:
-
这个菜单不属于按钮,而是任务栏按钮所代表的窗口的系统菜单。如果按钮有一个上下文菜单,这可能是一组窗口的集合,而不是一个特定的窗口(甚至是一个进程的窗口)。
根据窗口的上下文菜单做出判断对我来说听起来像是一种狡猾的方法,尤其是基于文本,因为这会根据用户所在的世界而改变。应用程序还可以更改此菜单的内容,因此无法保证它会包含您期望的内容。最好检查窗口样式,是否最小化等,以找出也会影响菜单内容的信息。
我将根据您的需求似乎来自问题来回答这个问题,而不是您直接询问的内容,因为 (a) 不可能按要求进行,并且 (b) 我认为您正在尝试做其他事情。 (作为一般准则,在一个问题中最好说明您为什么要尝试做某事 - 甚至可以问这个问题,即“我如何实现 X” - 以防有比你更好的方法使用。这里,X 可能是“查找有关此窗口的信息”而不是“获取上下文菜单的文本”,因为这可能只是获取 X 的一种可能方法。)我还认为提取来自第三方应用程序(如资源管理器)(任务栏是资源管理器窗口)内部的数据很脆弱,并且容易在未来的 Windows 版本中中断。
系统菜单或窗口信息(无论哪一个)属于应用程序窗口。 除非任务栏按钮被分组(然后是子项),否则一个任务栏按钮对应于系统中的一个特定窗口。所以你要做的是找到这些窗口。你这样做:
使用EnumWindows
函数
然后对于传递给回调的每个窗口,使用GetWindowLong
和GWL_EXSTYLE
检查扩展窗口样式以查看WS_EX_APPWINDOW
bit is set
此外,有时会显示其他窗口:these heuristics 应该会有所帮助。
这些窗口中的每一个都是一个应该出现在任务栏、Alt-Tab 对话框等上的窗口。
您说您正在获取任务栏按钮的文本 - 这可能是窗口的窗口标题,GetWindowText
是获取窗口标题的规范(阅读:可能更可靠)方法属于另一个进程。
如果你真的想要弹出菜单,那么:
使用GetSystemMenu
检索窗口系统菜单的句柄。应用程序可以对此进行自定义,因此如果您的应用程序正在执行此操作(这就是您想要弹出菜单的原因),请确保您将 false
传递给 bRevert
参数
然后您可以使用GetMenuItemCount
获取菜单项的数量,并为每个调用GetMenuItemInfo
获取有关每个菜单项的信息。将 true
传递给 fByPosition
参数以指示您正在按位置访问菜单(因为您知道计数,所以您将获得项目 0、1、2...count-1)。
MENUITEMINFO
结构,它(我想,我从来没有编写过代码,所以我没有测试过)将通过dwTypeData
字段“如果在 fMask 成员中设置了 MIIM_STRING 标志”。
如果你真的想要关于窗口状态的信息,你可以使用IsIconic
来查看它是否被最小化,再次GetWindowLong
来获取其他信息等方法获取此信息。我' d 建议您问另一个关于如何获取有关窗口的特定信息以获取详细信息的 SO 问题。
希望有帮助!
【讨论】:
@Adam:我已经一个星期没有回答了……有用吗?有什么我可以添加到答案中的吗?以上是关于获取特定任务栏按钮的上下文菜单文本的主要内容,如果未能解决你的问题,请参考以下文章
QMainWindow 菜单栏:OpenGL 触发函数导致 GL 上下文问题
Android由一个文本或者按钮点击之后,可以弹出来上下文菜单这个功能怎么做?
如何获取 QToolBar / QDockWidget 上下文菜单操作?