【问题标题】:Get window icon: GetClassLong VS SendMessage获取窗口图标:GetClassLong VS SendMessage
【发布时间】:2015-01-10 02:56:15
【问题描述】:

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

SendMessage(HWND,0x7F lParam, wParam)

GetClassLong(HWND, -14|-34)

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

【问题讨论】:

  • 为什么要使用魔法常数?也许如果你停止这样做,可能会更容易理解发生了什么。

标签: c++ winapi


【解决方案1】:

GetClassLong 从窗口类中检索longs。

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

但是一个窗口只是基于它,它可以覆盖一切。
因此,设置窗口类的图标不会修改任何已经创建的类,您必须改为向窗口发送消息。
读取 windowclass-data 会得到陈旧的数据,这些数据可能与窗口相关,也可能不相关。

顺便说一句,-14|-34 将是 GCL_HICON|GCL_HICONSM-2,这实际上没有意义。
明确地说您一个接一个地阅读两个索引。

【讨论】:

    【解决方案2】:

    -14 是GCL_HICON,它是注册时指定的 的(可选资源)图标。

    一个特定的窗口可以随后指定它自己的图标 (WM_SETICON),随后更改为 GCL_HICON 不会影响它。

    我也怀疑您是否可以尝试拉动GCL_HICON | GCL_HICONSM,如果它们不同,值会是什么?

    【讨论】:

      【解决方案3】:

      一些额外的事情:

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

      2) 你在SendMessage() 中切换了wParamlParamwParam 是第一位的。

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

      4) 不要尝试将 GetClassLong() 中的 | 替换为 || 或索引数组,并期望它也能正常工作。你别无选择,只能打两个电话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 2014-01-28
        • 2012-04-15
        • 1970-01-01
        • 2016-01-29
        • 2010-12-05
        相关资源
        最近更新 更多