Windows 7应用程序任务栏图标,字体大小和快捷方式

时间:2010-04-21 08:22:56

标签: winapi mfc windows-7 taskbar

我们遇到了一些涉及Windows 7为不同应用程序显示的任务栏图标的行为。我想知道是否有人可以对此有所了解:

  • Windows 7设置为font-size = 110%。
  • 两个MFC对话框应用程序A.exe和B.exe具有完全相同的.ico资源。
  • A.exe有一个与之关联的快捷方式; B.exe没有。
  • 运行A.exe会在任务栏上显示一个很好的插值图标。
  • 运行B.exe在任务栏上显示不同的图标(未插入)。

我们希望A.exe和B.exe的任务栏上显示相同的图标 - 通过创建B.exe的快捷方式可以轻松实现这一点。但是,我真的想更多地了解正在发生的事情。

在尝试了解发生了什么时,我已经处理了B.exe中的WM_GETICON消息,根据GetSystemMetrics SM_CXICON / SM_CYICON或SM_CXSMALLICON / SM_CYSMALLICON大小给出的大小返回一个图标。但是,这似乎不会影响任务栏中显示的图标。

我也知道我们可以在B.exe中创建一个.ico文件,其中包含许多不同大小的图标 - 这可能会改善一些事情,但这是一个繁琐的解决方案!

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

刚刚通过以下简单方案遇到了这个问题(全部在win7上):

  1. 使用图标B
  2. 创建A.exe
  3. 使用不同的图标C(通过winapi CreateLink创建)与A.exe关联的B.lnk
  4. 单击B.lnk运行。在某些win7机器上,任务栏的图标是C.但是,在其他机器(也是win7)上,它是B。
  5. 如果图标为C,则甚至无法通过以下代码进行更改:

    const HANDLE bigicon = ::LoadImage(::GetModuleHandle(0), MAKEINTRESOURCE(IDI_TO_ICON), IMAGE_ICON, 256, 256, 0);
    if (bigicon) {
        ::SendMessage(theMainWnd, WM_SETICON, ICON_BIG, (LPARAM)bigicon);
        ::SendMessage(GetWindow(theMainWnd, GW_OWNER), WM_SETICON, ICON_BIG, (LPARAM)bigicon);
    }
    const HANDLE smallicon = ::LoadImage(::GetModuleHandle(0), MAKEINTRESOURCE(IDI_TO_ICON_SMALL), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
    if (smallicon) {
        ::SendMessage(theMainWnd, WM_SETICON, ICON_SMALL, (LPARAM)smallicon);
        ::SendMessage(GetWindow(theMainWnd, GW_OWNER), WM_SETICON, ICON_SMALL, (LPARAM)smallicon);
    }