C++ 获取窗口图标:GetClassLong VS SendMessage

C++ 获取窗口图标:GetClassLong VS SendMessage,c++,winapi,C++,Winapi,如果我知道窗口图标的句柄,有两种方法可以获取窗口图标: SendMessage(HWND,0x7F lParam, wParam) 及 但即使我用GetClassLong从窗口获取图标,我也不能用SetClassLong设置新图标,而是用SendMessage成功设置新图标。 我需要知道:为什么有时使用第二种方法,但不使用第一种方法。为什么总是从SendMessage(WN_SETICON)开始,而SetClassLong(HWND,-14 |-34,HICON)不起作用呢?-14是注册类时指

如果我知道窗口图标的句柄,有两种方法可以获取窗口图标:

SendMessage(HWND,0x7F lParam, wParam)

但即使我用GetClassLong从窗口获取图标,我也不能用SetClassLong设置新图标,而是用SendMessage成功设置新图标。
我需要知道:为什么有时使用第二种方法,但不使用第一种方法。为什么总是从SendMessage(WN_SETICON)开始,而SetClassLong(HWND,-14 |-34,HICON)不起作用呢?

-14是注册类时指定的(可选资源)图标

特定窗口可以随后指定其自己的图标(
WM_SETICON
),随后对
GCL\u HICON
不会影响它

我还怀疑您是否可以尝试拉取
GCL_HICON | GCL_HICONSM
,如果它们不同,值会是多少?

从窗口类中检索
long
s

窗口类是创建指定类型窗口的蓝图,而不是窗口本身。
它可以包含很多默认值,比如默认图标和默认小图标

但窗口仅基于它,它可以覆盖所有内容。
因此,设置windowclass图标不会修改任何已创建的类,您必须改为向窗口发送消息。
读取windowclass数据会得到过时的数据,这些数据可能与窗口相关,也可能与窗口无关

另一方面,
-14 |-34
将是
GCL|u HICON | GCL_HICONSM
,或
-2
,实际上没有意义。

明确地说,你一个接一个地阅读这两个索引。

还有几点:

1) 不要对Windows API常量值使用幻数。使用
WM_GETICON
,而不是
0x7F
。使用其他答案中提到的
GCL
名称

2) 您在
SendMessage()
中切换了
wParam
lParam
<代码>wParam排在第一位

3) 不要使用
GetClassLong()
;它不是64位安全的(图标句柄是指针)。请改用
GetClassLongPtr()
。在命名常量中,也用
GCL
替换
GCL


4) 不要试图用
|
或索引数组替换
GetClassLong()
中的
|
,并期望这也能起作用。你别无选择,只能打两个电话。

为什么要使用魔法常数?也许如果你停止这样做,就更容易理解发生了什么。
GetClassLong(HWND, -14|-34)