程序有个特殊的需求,就是运行时,要把状态栏上的图标变成小图标(下图1)。默认情况下,我们的系统状态栏上的图标都是大图标(下图2),在win7,win8上都可以正常运行,实现方式如下:'把SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\的TaskbarSmallIcons值改成1
 rc = RegOpenKeyEx(HKEY_CURRENT_USER, SUBKEY_ADVANCED, 0, KEY_SET_VALUE, hSubKey) If rc <> ERROR_SUCCESS Then Exit Sub  rc = RegSetValueEx(hSubKey, REGNAME_TASKBARSMALLICONS, 0, REG_DWORD, p_SmallIcons, Len(p_SmallIcons))
  rc = RegCloseKey&(HKEY_CURRENT_USER&)'然后给系统发消息
Call SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 5000, w_retCode)
但是win10就是不行,奇了怪了。,望指教
图一

解决方案 »

  1.   

    你确定Win10下,仍然是由那个注册表设置信息控制的吗?你可以先把注册表中的那个内容删除,然后手动改变任务栏的图标显示方式,
    看看它是否创建了那个注册表项、并且对应的值(数据类型及格式)是多少。
      

  2.   

    嗯,注册表修改对着呢,现在的现象是程序运行时,手动打开任务栏的属性,显示已经选择小图标,但是任务栏没有变成小图标,所以怀疑是发送消息出问题了。但是就是不知道要换成什么消息,怎么个发送。
    我的意思不是说看你的程序修改注册表结果对不对。
    我是说,你把那个注册表项(TaskbarSmallIcons)删除掉,然后直接操作任务栏的属性,
    让它显示为大图标、小图标,看看系统会不会把TaskbarSmallIcons创建出来、以及大图标、小图标时对应什么样的数据。
    (就是首先要搞清楚:在Win10下,是不是跟Win7、Win8还是一样的。)
      

  3.   

    按您的指示操作了下,删掉后,通过任务栏操作后还是会创建的,所以感觉注册表那块对着,就是不知道win10,跟win7,win8之间的消息机制有什么变动?
      

  4.   

    我在 Win7/64位下试了一下你的代码,也是有效的。
    注册表那儿没变,看来是消息的变动了,这个不知道能不能查到资料。
     WM_SETTINGCHANGE这个应该是不会变的,
    估计在HWND_BROADCAST这个参数上有变化。不知道可不可以用 Spy++把这个消息“找出来”。
      

  5.   

    没有用过Spy++,不知道怎么找消息
    我msdn的论坛上也提问了,就是没有人理,奇了怪,麻烦大虾们上去顶顶..
    https://social.technet.microsoft.com/Forums/en-US/c6160636-a7ad-4bd0-9fc4-061b75c9b4ea/windows10-desktop-app-how-to-dynamically-set-the-icon-on-the-taskbar-to-large-or-small
    我的英文很烂,如果上面没有描述清楚,麻烦给咱在上面回帖说明下,谢谢了