我有一些代码使用带有TB_GETBUTTON消息的User32.SendMessage从Windows TaskBar中获取TaskBar按钮及其文本,以检索TBBUTTON结构(通过C#P / Invokes的Win32 API)。但是我想弄清楚如何,一旦我有按钮的句柄,抓住相关的上下文菜单文本。对于我想要检索的特定应用程序,有一些状态信息。按钮文本给我一些,但我需要上下文菜单文本来完成它。
有什么想法吗?
答案 0 :(得分:7)
这还不完全清楚......上下文菜单没有文本,因此它们有菜单项,每个菜单项都有文本。通过“上下文菜单文本”,您是指任务栏按钮的弹出/上下文菜单中菜单项的文本?例如,下面的屏幕截图中的“恢复”,“最小化”等?
如果是这样,我怀疑你是以错误的方式解决这个问题:
我将根据你的需求似乎从这个问题回答这个问题,而不是你直接问的问题,因为(a)不可能被问及(b)我认为你正试图做点别的。 (作为一般指导,在一个问题中,很好地说明你为什么要做某事 - 甚至可能会问这个问题,即'如何实现X' - 以防万一有一个比你更好的方法这里,X是可能'找出关于这个窗口的信息'不'获取上下文菜单的文本',因为这可能只是一种可能的方法来获取X.)另外我认为提取来自Explorer等第三方应用程序(任务栏是资源管理器窗口)内部的数据很脆弱,在未来的Windows版本中容易中断。
系统菜单或窗口信息(无论哪一个)属于应用程序窗口。除非将任务栏按钮分组(然后是子项目),否则一个任务栏按钮对应于系统中的一个特定窗口。所以你想要做的就是找到这些窗户。你这样做:
EnumWindows
功能GetWindowLong
和GWL_EXSTYLE
检查扩展窗口样式,以查看WS_EX_APPWINDOW
bit is set 这些窗口中的每一个都是应该出现在任务栏,Alt-Tab对话框等上的窗口。
你说你正在获取任务栏按钮的文本 - 这可能是窗口的窗口标题,而GetWindowText
是规范(读取:可能更可靠)获取标题的方式属于另一个进程的窗口。
如果你真的想要弹出菜单,那么:
GetSystemMenu
检索窗口系统菜单的句柄。应用程序可以对此进行自定义,因此,如果您的应用正在执行此操作(这就是您需要弹出菜单的原因),请确保将false
传递给bRevert
参数然后,您可以使用GetMenuItemCount
获取菜单项的数量,并为每个调用GetMenuItemInfo
获取有关每个菜单项的信息。将true
传递给fByPosition
参数,表示您正在按位置访问菜单(因为您知道计数,您将获得项目0,1,2 ...... count-1)。 / p>
MENUITEMINFO
结构(我认为,我从来没有编过代码,所以我没有测试过)会告诉你与项目相关的文字通过dwTypeData
字段“如果在fMask成员中设置了MIIM_STRING标志”。 如果您确实需要有关窗口状态的信息,则可以使用IsIconic
之类的方法获取此信息,以查看是否已将其最小化,GetWindowLong
再次获取其他信息,我建议你问另一个关于如何获取有关窗口的具体信息的问题。
希望有所帮助!