进行了大量研究,试图弄清楚如何让它正常工作。我读到如果您过滤 WM_NOTIFY -> NM_CLICK,它会捕获 syslink 的实际点击事件。问题是它捕获了事件,尽管它陷入了无休止的递归,并且在几秒钟内你有数百个浏览器窗口或链接打开为。
采取的步骤:
- 在对话框中创建 Syslink
- 为 Syslink 控制链接添加标题并将 IDD 更改为 IDC_LINK1
为 NM_CLICK 事件过滤 WM_NOTIFY
case WM_NOTIFY: //case NM_CLICK: switch(LOWORD(wParam)) { case NM_CLICK: switch(LOWORD(wParam)) { case IDC_LINK1: // Standard ShellExecute with added check for IsLinkCtrl to make sure its the right kind of control. OpenLink(hWndDlg, LOWORD(wParam)); break; } break; } break;
我想我真正的问题是如何正确执行此操作?我没有看到任何很好的示例来说明如何正确过滤 Syslink 以将链接作为 url 执行。
最佳答案
澄清一下,我不认为您使用的是托管 C++,因为我不确定您为什么将 NM_CLICK 通知代码称为事件。 此外,您不必捕获任何东西,您不处理任何异常,您只是处理 WM_NOTIFY 消息。
无论如何,我不确定您为什么会遇到这种特殊行为,因为我没有看到您在代码片段之外做了什么,但我知道是什么导致了它。 在我们的代码片段中,您使用 wParam 来确定通知代码,这是不正确的。此控件不使用 wParam。要确定通知代码,您应该执行以下操作:
NMHDR* pHeader = (NMHDR*)lParam;
switch (pHeader->code)
pHeader->code 保存您应该使用的通知代码值,pHeader->hwndFrom 是被点击的控件的句柄。
此外,您再次使用 LOWORD(wParam) 并将其作为参数传递给函数调用。你没有展示你在这个函数中做了什么,但我可以得出结论,代码也不正确。 同样的lParam是指向NMLINK结构的指针。 该结构的第一个成员是上面提到的 NMHDR,下一个成员是 LITEM 结构,应该用于确定 URL 是什么。
NMLINK* pNMLink = (NMLINK*)lParam;
LITEM iItem = pNMLink->item;
item.szUrl 是您应该在调用 ShellExecute 调用打开时使用的 URL。
关于c++ - 如何为 Syslink 控制处理 NM_CLICK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726099/