如何知道在处理TTN_LINKCLICK消息后点击气球上的链接?

Car*_*lho 7 delphi winapi notifications tooltip

TLama先生回答了我的最后一个问题(如何捕获TTN_LINKCLICK通知?)之后,有一点未得到答复,因为没有问过:)

如果有多个链接,如何识别我在气球上点击的每个链接?

我希望能够在气球中包含多个链接,并以不同方式响应点击.

Rob*_*edy 8

通知没有参数,因此您不知道单击了哪个链接.道德:如果您需要多个链接,请考虑使用比工具提示更通用的界面,例如Toast通知或对话框.

  • 为什么你需要*获取*工具提示文本?当您展示工具提示时,您没有文本吗?只需使用您之前使用的相同文本即可.如果必须,请向控件发送`ttm_GetText`消息. (3认同)

Car*_*lho 3

最后我设法解决了这个问题,是的,可以从工具提示中单击的链接获取信息

\n

确实没有任何官方文档谈论它,这是微软的一个大错误。我相信任何从一开始就使用 Windows 的人都已经知道答案,但是要么这些人已经死了,要么他们只是有比帮助人们解决此类问题更重要的问题,是的,解决起来非常简单。让我们解释一下...

\n

有关WM_NOTIFY消息的帮助对其 lParam 参数进行了以下说明:

\n
\n

指向包含通知代码\n和附加信息的 NMHDR 结构的指针。对于某些通知消息,此参数指向一个较大的结构,该结构将 NMHDR 结构作为第一个成员。

\n
\n

上面文本中最重要的部分是一些通知消息指向更大的结构,其第一个成员是 NMHDR。读到这里我想“嗯,在一般情况下有没有关于点击链接的消息?” 所以我用谷歌搜索“wm_notify link click”,第一个结果给出了答案:NM_CLICK

\n

NM_CLICK 是一条通知消息,当用户用鼠标左键单击链接时,通过 WM_NOTIFY 发送到控件的父窗口。这里提到的链接是一个SysLink Control,MSDN 上有大量相关文档。当使用 TTF_PARSELINKS 标志时,工具提示内的文本(链接)将转换为 SysLink 控件,这是非常有意义的。

\n

另外,在 NM_CLICK 文档页面上,提到了 NMLINK 结构,其中包含有关通知的其他信息。当查看有关 NMLINK 的文档时,我意识到它的第一个成员是 NMHDR,第二个成员是 LITEM 这是一个包含有关链接信息的结构。

\n

从现在开始很清楚,当涉及到 TTN_LINKCLICK 时,WM_NOTIFY 消息携带的实际上是一个 NMLINK 结构,其中包含默认的第一个成员(NMHDR)和第二个成员,其中包含我们需要了解的有关单击链接的所有信息。(精简版)。

\n

现在,有了这些信息,就可以非常轻松地从单击的链接中获取信息。下面的示例仅包含 Pascal (Delphi) 伪代码,并且是处理在 TOOLINFO 的 hwnd 成员中通知的窗口中的 WM_NOTIFY 消息的方法

\n
procedure TFormPrincipal.HandleNotifyMessages(var AMessage: TWMNotify);\nvar\n  Link: TNMLink;\nbegin\n  if Assigned(AMessage.NMHdr) and (AMessage.NMHdr.code = TTN_LINKCLICK) then\n  begin\n    Link := PNMLink(AMessage.NMHdr)^;\n\n    Application.MessageBox(PChar(\'O link clicado tem href="\' + Link.item.szUrl + \'" e id="\' + Link.item.szID + \'"\'),\'Sou foda!\',MB_ICONINFORMATION);\n  end;\nend;\n
Run Code Online (Sandbox Code Playgroud)\n

最终结果如下:

\n

带有 TTS_BALLOON 的工具提示(非必需)

\n

单击其中一个链接时会显示消息

\n

显示 href、id 和索引的消息

\n

工具提示中包含的文本如下:

\n
procedure TFormPrincipal.HandleNotifyMessages(var AMessage: TWMNotify);\nvar\n  Link: TNMLink;\nbegin\n  if Assigned(AMessage.NMHdr) and (AMessage.NMHdr.code = TTN_LINKCLICK) then\n  begin\n    Link := PNMLink(AMessage.NMHdr)^;\n\n    Application.MessageBox(PChar(\'O link clicado tem href="\' + Link.item.szUrl + \'" e id="\' + Link.item.szID + \'"\'),\'Sou foda!\',MB_ICONINFORMATION);\n  end;\nend;\n
Run Code Online (Sandbox Code Playgroud)\n