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

Ada*_*ile 3 winapi taskbar contextmenu

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

有任何想法吗?

Dav*_*vid 7

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

任务栏按钮及其弹出菜单

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

  1. 此菜单不属于该按钮,但是是由任务栏按钮表示的窗口的系统菜单.如果按钮具有上下文菜单,则这可能是针对窗口的分组集合,而不是一个特定窗口(甚至是一个窗口的窗口).
  2. 根据窗口的上下文菜单做出判断听起来像是一种狡猾的方法,特别是基于文本,因为这将根据用户所在的世界的位置而改变.应用程序也可以更改此菜单的内容,因此无法保证它将包含您希望存在的内容.最好检查窗口样式,如果它被最小化等,以找出也影响菜单内容的信息.

我将根据你的需求似乎从问题中回答这个问题,而不是你直接问的问题,因为(a)根据要求不可能和(b)我认为你正试图做别的事情.(作为一般指导,在一个问题中,很好地说明你为什么要做某事 - 甚至可能会问这个问题,即'如何实现X' - 以防万一有一个比你更好的方法这里,X 可能是 "找到关于这个窗口的信息"而不是"获取上下文菜单的文本",因为这可能只是一种可能的方法来获取X.)另外我认为从第三个内部提取数据像Explorer这样的任务应用程序(任务栏是一个资源管理器窗口)很脆弱,在未来的Windows版本中很容易破解.

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

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

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

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

  • 使用GetSystemMenu检索手柄,该窗口的系统菜单.应用程序可以自定义,所以如果您的应用程序正在执行此操作(这就是您想要弹出菜单的原因),请确保传递falsebRevert参数
  • 然后,您可以使用GetMenuItemCount和为每个调用GetMenuItemInfo获取菜单项的数量,以获取有关每个菜单项的信息.传递truefByPosition参数以指示您按位置访问菜单(因为您知道计数,您将获得项目0,1,2 ...... count-1).

    • 这填补了MENUITEMINFO结构,(我想,我还没有过实现代码,所以我没有测试过)会告诉你,与项目相关的文本通过dwTypeData字段"如果MIIM_STRING标志在fMask成员设置" .

如果你真的想要关于窗口状态的信息,你可以使用类似的方法来获取这些信息IsIconic,看看它是否被最小化,GetWindowLong再次获取其他信息等.我建议你问另一个关于如何获得有关a的具体信息的问题.窗口的细节.

希望有所帮助!