Ada*_*ile 3 winapi taskbar contextmenu
我有一些代码使用带有TB_GETBUTTON消息的User32.SendMessage从Windows TaskBar中获取TaskBar按钮及其文本,以检索TBBUTTON结构(通过C#P/Invokes的Win32 API).但是我想弄清楚如何,一旦我有按钮的句柄,抓住相关的上下文菜单文本.对于我想要检索的特定应用程序,有一些状态信息.按钮文本给我一些,但我需要上下文菜单文本来完成它.
有任何想法吗?
这还不完全清楚......上下文菜单没有文本,因此它们有菜单项,每个菜单项都有文本.通过"上下文菜单文本",您是指任务栏按钮的弹出/上下文菜单中菜单项的文本?例如,下面的屏幕截图中的"恢复","最小化"等?

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