我自己建立了一个文件类型(扩展名为TTU),
然后在注册表中建立了各个主键,指定了默认图标和打开程序,这些都实现了,工作正常。最后在程序要发布的时候有了麻烦,我的安装程序是用Installshield做的把上述设置添加到注册表中也都没问题,问题就出在这个默认图标上,每次总要在注销或是重启后才能起效,看来是注册表设置并没有实时更新的结果,于是我用了SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,0)来重启,但是还是没有用啊,请各位高手指点

解决方案 »

  1.   

    试试重起注册表:
    sendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
      

  2.   

    试试这样:SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0);
    // 修改注册表代码
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0);
      

  3.   

    上面有误,完整的函数如下:function RefreshScreenIcons : Boolean;
    const
      KEY_TYPE = HKEY_CURRENT_USER;
      KEY_NAME = 'Control Panel\Desktop\WindowMetrics';
      KEY_VALUE = 'Shell Icon Size';
    var
      Reg: TRegistry;
      strDataRet, strDataRet2: string; procedure BroadcastChanges;
     var
       success: DWORD;
     begin
       SendMessageTimeout(HWND_BROADCAST,
                          WM_SETTINGCHANGE,
                          SPI_SETNONCLIENTMETRICS,
                          0,
                          SMTO_ABORTIFHUNG,
                          10000,
                          success);
     end;begin
      Result := False;
      Reg := TRegistry.Create;
      try
        Reg.RootKey := KEY_TYPE;
        // 1. open HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
        if Reg.OpenKey(KEY_NAME, False) then
        begin
          // 2. Get the value for that key
          strDataRet := Reg.ReadString(KEY_VALUE);
          Reg.CloseKey;
          if strDataRet <> '' then
          begin
            // 3. Convert sDataRet to a number and subtract 1,
            //    convert back to a string, and write it to the registry
            strDataRet2 := IntToStr(StrToInt(strDataRet) - 1);
            if Reg.OpenKey(KEY_NAME, False) then
            begin
              Reg.WriteString(KEY_VALUE, strDataRet2);
              Reg.CloseKey;
              // 4. because the registry was changed, broadcast
              //    the fact passing SPI_SETNONCLIENTMETRICS,
              //    with a timeout of 10000 milliseconds (10 seconds)
              BroadcastChanges;
              // 5. the desktop will have refreshed with the
              //    new (shrunken) icon size. Now restore things
              //    back to the correct settings by again writing
              //    to the registry and posing another message.
              if Reg.OpenKey(KEY_NAME, False) then
              begin
                Reg.WriteString(KEY_VALUE, strDataRet);
                Reg.CloseKey;
                // 6.  broadcast the change again
                BroadcastChanges;
                Result := True;
              end;
            end;
          end;
        end;
      finally
        Reg.Free;
      end;
    end;
      

  4.   

    非得改那个'Shell Icon Size'才能起作用吗