获取特定TaskBar按钮的上下文菜单文本

时间:2011-06-21 18:03:41

标签: winapi contextmenu taskbar

我有一些代码使用带有TB_GETBUTTON消息的User32.SendMessage从Windows TaskBar中获取TaskBar按钮及其文本,以检索TBBUTTON结构(通过C#P / Invokes的Win32 API)。但是我想弄清楚如何,一旦我有按钮的句柄,抓住相关的上下文菜单文本。对于我想要检索的特定应用程序,有一些状态信息。按钮文本给我一些,但我需要上下文菜单文本来完成它。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

这还不完全清楚......上下文菜单没有文本,因此它们有菜单项,每个菜单项都有文本。通过“上下文菜单文本”,您是指任务栏按钮的弹出/上下文菜单中菜单项的文本?例如,下面的屏幕截图中的“恢复”,“最小化”等?

Taskbar button and its popup menu

如果是这样,我怀疑你是以错误的方式解决这个问题:

  1. 此菜单不属于该按钮,但是是任务栏按钮所代表的窗口的系统菜单。如果按钮具有上下文菜单,则可能是针对窗口的分组集合,而不是一个特定窗口(甚至是一个窗口的窗口。)
  2. 基于窗口的上下文菜单做出判断对我来说听起来像是一种狡猾的方法,特别是基于文本,因为这会根据用户所处的世界位置而改变。应用程序也可以更改此菜单的内容,因此无法保证它将包含您希望存在的内容。最好检查窗口样式,如果它被最小化等,以找出也影响菜单内容的信息。
  3. 我将根据你的需求似乎从这个问题回答这个问题,而不是你直接问的问题,因为(a)不可能被问及(b)我认为你正试图做点别的。 (作为一般指导,在一个问题中,很好地说明你为什么要做某事 - 甚至可能会问这个问题,即'如何实现X' - 以防万一有一个比你更好的方法这里,X是可能'找出关于这个窗口的信息'不'获取上下文菜单的文本',因为这可能只是一种可能的方法来获取X.)另外我认为提取来自Explorer等第三方应用程序(任务栏是资源管理器窗口)内部的数据很脆弱,在未来的Windows版本中容易中断。

    系统菜单或窗口信息(无论哪一个)属于应用程序窗口。除非将任务栏按钮分组(然后是子项目),否则一个任务栏按钮对应于系统中的一个特定窗口。所以你想要做的就是找到这些窗户。你这样做:

    这些窗口中的每一个都是应该出现在任务栏,Alt-Tab对话框等上的窗口。

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

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

    • 使用GetSystemMenu检索窗口系统菜单的句柄。应用程序可以对此进行自定义,因此,如果您的应用正在执行此操作(这就是您需要弹出菜单的原因),请确保将false传递给bRevert参数
    • 然后,您可以使用GetMenuItemCount获取菜单项的数量,并为每个调用GetMenuItemInfo获取有关每个菜单项的信息。将true传递给fByPosition参数,表示您正在按位置访问菜单(因为您知道计数,您将获得项目0,1,2 ...... count-1)。 / p>

      • 这会填充一个MENUITEMINFO结构(我认为,我从来没有编过代码,所以我没有测试过)会告诉你与项目相关的文字通过dwTypeData字段“如果在fMask成员中设置了MIIM_STRING标志”。

    如果您确实需要有关窗口状态的信息,则可以使用IsIconic之类的方法获取此信息,以查看是否已将其最小化,GetWindowLong再次获取其他信息,我建议你问另一个关于如何获取有关窗口的具体信息的问题。

    希望有所帮助!