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

Winapi 获取特定任务栏按钮的上下文菜单文本,winapi,contextmenu,taskbar,Winapi,Contextmenu,Taskbar,我有一些代码,它使用User32.SendMessage和TB#u GETBUTTON消息从windows任务栏获取任务栏按钮及其文本,以检索TBBUTTON结构(通过C#p/Invokes的Win32 API)。但我想弄清楚,一旦我有了按钮的手柄,如何抓取关联的上下文菜单文本。这里有一些我想要检索的特定应用程序的状态信息。按钮文本让我得到了一些,但我需要上下文菜单文本来完成它 有什么想法吗?这还不完全清楚。。。上下文菜单没有文本,它们有菜单项,每个菜单项都有文本。“上下文菜单文本”是指任务栏按

我有一些代码,它使用User32.SendMessage和TB#u GETBUTTON消息从windows任务栏获取任务栏按钮及其文本,以检索TBBUTTON结构(通过C#p/Invokes的Win32 API)。但我想弄清楚,一旦我有了按钮的手柄,如何抓取关联的上下文菜单文本。这里有一些我想要检索的特定应用程序的状态信息。按钮文本让我得到了一些,但我需要上下文菜单文本来完成它


有什么想法吗?

这还不完全清楚。。。上下文菜单没有文本,它们有菜单项,每个菜单项都有文本。“上下文菜单文本”是指任务栏按钮弹出/上下文菜单中菜单项的文本吗?例如,下面截图中的“还原”、“最小化”等

如果是这样的话,我怀疑你走错了方向:

  • 此菜单不属于该按钮,而是由任务栏按钮表示的窗口的系统菜单。如果按钮具有关联菜单,则可能是针对一组窗口,而不是一个特定窗口(甚至是针对一个进程的窗口)
  • 对我来说,根据窗口的上下文菜单做出判断听起来像是一种不可靠的方法,尤其是基于文本,因为这会随着用户所在的世界而变化。应用程序还可以更改此菜单的内容,因此不能保证它将包含您期望的内容。如果窗口样式被最小化,最好检查它,等等,以找出同样影响菜单内容的信息
  • 我将根据你的需求来回答这个问题,而不是你直接提出的问题,因为(a)这不可能,而且(b)我认为你正在尝试做其他事情。(作为一个一般性的指导原则,在一个问题中,最好说明你为什么要做某件事,甚至可以问一下,例如“我如何实现X”-以防有比你正在使用的方法更好的方法。这里,X可能是“查找有关此窗口的信息”而不是“获取上下文菜单的文本”,因为这可能只是一种可能性。)另外,我认为从第三方应用程序(如Explorer(任务栏是一个Explorer窗口)的内部提取数据是很脆弱的,在未来的Windows版本中很容易损坏

    系统菜单或窗口信息(无论哪一个)属于应用程序窗口。除非任务栏按钮分组(然后是子项),否则一个任务栏按钮对应于系统中的一个特定窗口。所以你要做的就是找到这些窗口。您可以通过以下方式执行此操作:

    • 使用函数
    • 然后,对于传递给回调的每个窗口,使用with
      GWL_EXSTYLE
      检查扩展窗口样式,以查看
    • 此外,有时还会显示其他窗口:应该有帮助
    这些窗口中的每一个都是应该出现在任务栏、Alt Tab对话框等上的窗口

    您说您正在获取任务栏按钮的文本-这可能是窗口的窗口标题,并且是获取属于另一个进程的窗口标题的规范(阅读:可能更可靠)方法

    如果确实需要弹出菜单,则:

    • 用于检索窗口系统菜单的句柄。应用程序可以对此进行自定义,因此,如果您的应用程序正在执行此操作(这就是您想要弹出菜单的原因),请确保将
      false
      传递给
      bRevert
      参数
    • 然后,您可以使用和获取每个菜单项的信息。将
      true
      传递到
      fByPosition
      参数,以指示您正在按位置访问菜单(因为您知道计数,所以您将获得项目0、1、2…计数-1)

      • 这填充了一个结构,该结构(我想,我从来没有对它进行过编码,所以我没有测试过)将通过
        dwTypeData
        字段“如果在fMask成员中设置了MIIM_字符串标志”,告诉您与项关联的文本
    如果您确实需要有关窗口状态的信息,您可以使用诸如查看窗口是否最小化、再次获取其他信息等方法获取此信息。我建议您问另一个SO问题,关于如何获取有关窗口的任何特定信息以获取详细信息


    希望有帮助

    @Adam:我已经一个星期没有回答了。。。有帮助吗?有什么我可以补充的吗?