c++ - 如何为 Syslink 控制处理 NM_CLICK

标签 c++ winapi visual-c++ native win32gui

进行了大量研究,试图弄清楚如何让它正常工作。我读到如果您过滤 WM_NOTIFY -> NM_CLICK,它会捕获 syslink 的实际点击事件。问题是它捕获了事件,尽管它陷入了无休止的递归,并且在几秒钟内你有数百个浏览器窗口或链接打开为。

采取的步骤:

  1. 在对话框中创建 Syslink
  2. 为 Syslink 控制链接添加标题并将 IDD 更改为 IDC_LINK1
  3. 为 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/

相关文章:

c++ - 如何从子成员函数修改父公共(public)成员变量?

C++ 通过引用传递 Vector 字符指针

c++ - Win32 C++ 重绘窗口

c++ - 如何从 LPCTSTR 转换为 std::string?

c++ - 迭代器取消引用的 decltype 编译错误

c++ - 是否有适用于其他平台的 Visual C++ 运行时实现?

c++ - 如何访问其中有一对的 map

c++ winapi SHBrowseForFolder 浏览隐藏文件夹

c++ - 如何在不打开 GUI 的情况下从 Visual Studio 执行 WinZip?

c++ - Clistctrl选择检测