如何使用WinAPI获取MessageBox图标

3

我有一个 WH_CALLWNDPROC 钩子代码,用于处理 WM_INITDIALOG 消息以获取有关消息框的信息。我可以获得“消息”、“标题”、“按钮”,但我无法获得“图标”信息。我正在尝试使用以下函数:

long getIcon(HWND hwnd) { // handle of messagebox dialog
    HWND hlbl = GetDlgItem(hwnd,20);

    wcout << "LABEL HWND: " << hlbl << endl;

    if (hlbl != NULL) { 
         LRESULT r =  SendMessage(hlbl,WM_GETICON,0,0);
         return (long)r; 
    }

    return 0; 
}

这个函数总是返回0。我用MS Spy++检查过了,发现图标句柄为0。 正确的获取图标方式是什么?


2
MessageBox 图标是系统图标,您可以通过使用 LoadImage(或 LoadIcon)和 IDI_INFORMATIONIDI_ERRORIDI_WARNINGIDI_QUESTION 进行加载。 - jamesdlin
1个回答

2

在消息框对话框上显示的图标是使用带有SS_ICON样式的STATIC控件实现的。您可以通过向该控件发送STM_GETICON消息来获取图标句柄。

在您的问题所提供的代码中,名为hlbl的变量实际上是包含图标的STATIC控件的窗口句柄。我会将其命名为hIconWnd。更改名称后,获取图标的代码如下:

HICON getIcon(HWND hwnd) { // handle of messagebox dialog
    HWND hIconWnd = GetDlgItem(hwnd, 20);
    if (hIconWnd != NULL) { 
         return (HICON)SendMessage(hIconWnd, STM_GETICON, 0, 0); 
    }
    return NULL; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接