亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Windows 7 任務欄開發之覆蓋圖標(Overlay Icon)

瀏覽:3日期:2023-05-31 15:23:35

當第一次使用Windows 7 時,任務欄(Taskbar)的改變可以說讓我眼前一亮。在以前版本Windows 桌面功能的基礎上,Windows 7 任務欄為我們增添了許多其他功能:Jump Lists,Window PrevIEw,Process Bar,Overlay Icon 等等。

新任務欄的功能使我們的操作更加方便快捷,在參加北京.Net俱樂部舉辦的“Windows 7 發布活動時初步了解到有關應用程序支持Windows 7 任務欄特性方面的內容。那么作為一名開發人員我們的應用程序能否實現這些功能呢?答案當然是“可以,微軟提供了方便的工具Windows API Code Pack for .NET Framework 來幫助我們完成這些開發。

本篇主要演示Overlay Icon(MSDN上直譯為“覆蓋圖標)的功能,從字面上來看也許不太明白這是什么意思,在Windows 7 中UAC 功能為系統增加了安全性,當UAC 啟動時有些應用程序的圖標上方會顯示一個盾牌標志(如下圖),沒錯這個就是Overlay Icon 功能,下面就來看看它是如何實現的。

準備工作

1. 添加一些Overlay Icon 圖片(.ico)到項目Resources 中。

2. 下載Windows API Code Pack,增加Microsoft.WindowsAPICodePack.dll 和Microsoft.WindowsAPICodePack.Shell.dll。

3. 引用Microsoft.WindowsAPICodePack.Taskbar 命名空間。

TaskbarManager.SetOverlayIcon(Icon, String) 方法

TaskbarManager 類提供了一些常用的任務欄特性設置方法,其中SetOverlayIcon 方法有三種不同的方式來設置Overlay Icon:

//用于應用程序主窗口 public void SetOverlayIcon(System.Drawing.Icon icon, string accessibilityText) { CoreHelpers.ThrowIfNotWin7(); TaskbarList.SetOverlayIcon(OwnerHandle, icon != null ? icon.Handle : IntPtr.Zero, accessibilityText); }  //用于指定窗口 public void SetOverlayIcon(IntPtr windowHandle, System.Drawing.Icon icon, string accessibilityText) { CoreHelpers.ThrowIfNotWin7(); TaskbarList.SetOverlayIcon(windowHandle, icon != null ? icon.Handle : IntPtr.Zero, accessibilityText); }  //用于指定的WPF窗口 public void SetOverlayIcon(System.Windows.Window window, System.Drawing.Icon icon, string accessibilityText) { CoreHelpers.ThrowIfNotWin7(); TaskbarList.SetOverlayIcon( (new WindowInteropHelper(window)).Handle, icon != null ? icon.Handle : IntPtr.Zero, accessibilityText); }

在程序中通過TaskbarManager.Instance.SetOverlayIcon() 即可實現Overlay Icon 效果:

Icon icon = iconList.SelectedItem as Icon; TaskbarManager.Instance.SetOverlayIcon(icon, 'Overlay Icon Demo');

如果將Icon 和 String 都設為Null 則取消Overlay Icon 效果:

TaskbarManager.Instance.SetOverlayIcon(null, null);

單窗口示例

程序運行后的狀態:

在圖標列表中選擇Overlay Icon 后的不同效果:

多窗口示例

在默認情況下,如果從父窗口中調出子窗口,其任務欄圖標是組合疊加在一起的(如下圖):

如果想為不同的窗口中實現Overlay Icon 則首先需要通過修改TestWindow 的Application ID (AppID)將兩個窗口的任務欄圖標分離開。每個運行的窗口都會有各自的AppID,用來決定任務欄圖標屬于哪個窗口。這也就是為什么當我們打開多個 Word 文檔或IE 標簽后任務欄圖標都是自動疊加在一起的,所以我們可以通過修改窗口的AppID 使任務欄圖標分開顯示。

通過使用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,兩個窗口的任務欄圖標才真正的完成了分離:

通過SetOverlayIcon(IntPtr, Icon, String) 來設置指定窗口(TestWindow)的Overlay Icon:

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

分離后再來看看效果,只顯示MainWindow 圖標:

兩個窗口的圖標都顯示:

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

標簽: Windows系統
相關文章:
主站蜘蛛池模板: 韩国特黄毛片一级毛片免费 | 野外啪啪抽搐一进一出 | 鲁大师在线观看免费播放 | 久久精品国产2020观看福利色 | 手机毛片| 国产高清成人 | 美国一级毛片免费 | 欧美日韩成人午夜免费 | 亚洲欧美日本韩国 | 天天色综合三 | 久久国产精品久久久 | 午夜成年人视频 | 亚洲午夜影视 | 黑人一区二区 | 亚洲一区二区三区福利在线 | 中文字幕欧美成人免费 | 国内自拍 在线播放 网红 | 久热精品男人的天堂在线视频 | 欧美猛妇色xxxxxbbbb | 免费成年人视频 | 免费在线不卡视频 | 日韩一级一欧美一级国产 | 一本一道波多野结衣一区二区 | 好吊色综合网天天高清 | 黄色激情视频网站 | 日韩免费在线 | 国产剧情一区二区 | 三级黄.色| 欧美日韩在线免费观看 | 亚洲妇熟xxxxx妇色黄 | 国内精品久久久久影院老司 | 日本高清免费不卡毛片 | 黄色毛片a级 | 日韩欧美在线播放 | 精品国精品国产自在久国产不卡 | 一级毛片免费观看不卡的 | 国产香蕉在线视频 | 欧美人成在线观看 | 夜色成人 | 国产人妖在线观看一区二区 | 国产精品 色 |