我在下面的here中看到了这段代码。我测试了它,它可以正常工作。

// g_hLink is the handle of the SysLink control.
case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)            // CAST TO NMHDR*
    {
        case NM_CLICK:          // Fall through to the next case.
        case NM_RETURN:
        {
            PNMLINK pNMLink = (PNMLINK)lParam;  // CAST TO NMLINK*
            LITEM   item    = pNMLink->item;
            if ((((LPNMHDR)lParam)->hwndFrom == g_hLink) && (item.iLink == 0))
            {
                ShellExecute(NULL, L"open", item.szUrl, NULL, NULL, SW_SHOW);
            }
            else if (wcscmp(item.szID, L"idInfo") == 0)
            {
                MessageBox(hDlg, L"This isn't much help.", L"Example", MB_OK);
            }
            break;
        }
    }
    break;


参数lParam强制转换为NMHDR*NMLINK*类型。 WM_NOTIFY消息的文档说lParam可以强制转换为NMHDR*,但是NMLINK是封装NMHDR的不同结构。

当我们将lParam转换为这两者之间任意选择的结构时,实际上会发生什么?

最佳答案

NMLINK包含NMHDR作为其第一个元素:

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};


因此,指向NMLINK的指针等于指向其第一个成员(位于偏移量0的NMHDR结构)的指针,它们是相同的。这意味着您可以将NMHDR *转换为NMLINK *。

10-08 11:03