【发布时间】:2019-04-16 08:42:44
【问题描述】:
在我发送TB_DELETEBUTTON 消息以删除系统托盘工具栏中的(外部应用程序的)按钮后,它仍然是该已删除按钮的空白/空矩形,并且工具栏不会删除此空矩形,直到我左键或右键单击其他图标,最后工具栏窗口被重绘,我删除的按钮中的空矩形消失了。
这是一个我想避免的审美问题。我只是想在发送 TB_DELETEBUTTON 消息后以编程方式更新/重绘工具栏窗口,但是在我调用 UpdateWindow、UpdateLayeredWindow 或 RedrawWindow 后,已删除按钮的空矩形仍然存在。
我尝试与 RedrawWindow 一起使用的标志组合是:RDW_FRAME、RDW_ALLCHILDREN、RDW_UPDATENOW 和 RDW_INVALIDATE。
我传递给这些函数的窗口句柄是具有类名的窗口:“ToolbarWindow32”(其上驻留应用程序的系统托盘按钮/图标),可以找到获取此窗口句柄的示例here.
我的问题是:如何正确更新/重绘此窗口?
【问题讨论】:
-
使用 SendInput 将鼠标移到按钮上,shell 将删除它。至于“我怎样才能正确”,一旦你开始攻击另一个应用程序和系统实现细节,那艘船就启航了。没有合适的方法来做到这一点。
-
请注意:您是否检查过您正在处理哪个系统升级通知区域?可能有两个。一,
TrayNotifyWnd::SysPager的孩子,是你想要的。TrayNotifyWnd的另一个直接子代不是。 -
@Jimi 与此问题中的“GetSystemTrayHandle”函数相同:stackoverflow.com/questions/5174120/… 这是我必须调用绘画的正确句柄吗?
-
是的,就是这个。
GetSystemTrayHandle()方法(在问题中)搜索SysPager的孩子。ToolbarWindow32是正确的。但是,您将很难与 Shell 进行交互。这些接口不是公开的,AFAIK。
标签: c# .net vb.net winapi window