电脑技术学习

Windows 7 任务栏开发之覆盖图标(Overlay Icon)

dn001

  通过使用TaskbarManager.SetApplicationIdForSpecificWindow(IntPtr windowHandle,String appID) 方法可以修改窗口的AppID。但是目前下载的Windows API 1.0.1 版本有些小问题,使得SetApplicationIdForSpecificWindow 方法根本不起作用。根源就在TaskbarNativeMethods.cs 的SetWindowProperty 方法,没有对pv 进行任何赋值操作,导致propStore 根本没有值,所以在该方法中增加pv.SetString(value),重新编译并替换掉原来的 Microsoft.WindowsAPICodePack.Shell.dll 即可:

internal static void SetWindowProperty(IntPtr hwnd, PropertyKey propkey, 
                    string value) 
{ 
  // Get the IPropertyStore for the given window handle 
  IPropertyStore propStore = GetWindowPropertyStore(hwnd); 
       
  // Set the value 
  PropVariant pv = new PropVariant(); 
  pv.SetString(value); 
  propStore.SetValue(ref propkey, ref pv); 
 
  // Dispose the IPropertyStore and PropVariant 
  Marshal.ReleaseComObject(propStore); 
  pv.Clear(); 
}

  程序改好后,就可以使用SetApplicationIdForSpecificWindow(IntPtr, String) 干活了:

Window newWindow = new TestWindow(); 
newWindow.Show(); 
WindowInteropHelper helper = new WindowInteropHelper(newWindow); 
IntPtr ptr = helper.Handle;      
TaskbarManager.Instance.SetApplicationIdForSpecificWindow(ptr, "AppID");

  修改了TestWindow 的AppID,两个窗口的任务栏图标才真正的完成了分离:

Windows 7 任务栏开发之覆盖图标(Overlay Icon) 

  通过SetOverlayIcon(IntPtr, Icon, String) 来设置指定窗口(TestWindow)的Overlay Icon:

TaskbarManager.Instance.SetOverlayIcon(ptr, icon, "Overlay Icon Demo");

  分离后再来看看效果,只显示MainWindow 图标:

Windows 7 任务栏开发之覆盖图标(Overlay Icon)   

Windows 7 任务栏开发之覆盖图标(Overlay Icon)

  两个窗口的图标都显示:

Windows 7 任务栏开发之覆盖图标(Overlay Icon)   

Windows 7 任务栏开发之覆盖图标(Overlay Icon)

出处:http://www.cnblogs.com/gnIElee/

标签: