Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Api Code Pack For Net Framework

1,548 views

Published on

  • Be the first to comment

Api Code Pack For Net Framework

  1. 1.
  2. 2. Windows 7 程式開發入門使用 Windows API Code Pack for Microsoft .NET Framework<br />曹祖聖<br />台灣微軟資深講師<br /> jimycao@syset.com<br /> http://teacher.syset.com<br /> MCP, MCP+I, MCSA, MCSE, MCDBA, MCAD, MCSD, MCTS, MCITP, MCT, MVP<br />
  3. 3. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  4. 4. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  5. 5. 客製化工作列圖示<br />
  6. 6. 工作列進度與圖示顯示<br />// 名稱空間: Microsoft.WindowsAPICodePack.Shell.Taskbar<br />Taskbar.ProgressBar.CurrentValue = 10; // 0 ~ 100<br />Taskbar.ProgressBar.State = TaskbarButtonProgressState.Normal;<br />// NoProgress (不顯示進度)<br />// Indeterminate (跑馬燈方式)<br />// Normal (綠色正常顯示)<br />// Error (顯示紅色)<br />// Paused (暫停進度)<br />Taskbar.OverlayImage<br /> = new OverlayImage(new Icon(&quot;demo.ico&quot;), &quot;說明文字“)<br />
  7. 7. 工作列進度與圖示顯示<br />
  8. 8. Jump Lists小型的開始功能表<br />固定類別<br />目標<br />已知類別<br />自訂類別<br />使用者工作<br />工作<br />工作列工作<br />
  9. 9. 加入自訂工作<br />string taskPath = &quot;c:windowsystem32otepad.exe&quot;;<br />Taskbar.JumpList.UserTasks.Add(<br /> new JumpListLink { <br /> Title = &quot;開啓記事本&quot;,<br /> Path = taskPath,<br />IconReference = new IconReference(taskPath, 0)<br /> }<br />);<br />Taskbar.JumpList.RefreshTaskbarList();<br />
  10. 10. 加入自訂類別<br />CustomCategory category1 = new CustomCategory(&quot;分類 #1&quot;);<br />CustomCategory category2 = new CustomCategory(&quot;分類 #2&quot;);<br />Taskbar.JumpList.CustomCategories.Add(category1);<br />Taskbar.JumpList.CustomCategories.Add(category2);<br />
  11. 11. 在自訂類別中加入自訂連結<br />category1.JumpListItems.Add(<br /> new JumpListLink() {<br /> Title = &quot;開啓記事本&quot;,<br /> Path = taskPath,<br />IconReference = new IconReference(taskPath, 0)<br /> }<br />);<br />Taskbar.JumpList.RefreshTaskbarList();<br />
  12. 12. 在自訂類別中加入自訂項目<br />在執行以下程式之前,必須要在 Registry 中註冊程式與副檔名的對應<br />category2.JumpListItems.Add(<br /> new JumpListItem(&quot;c:ataemo.txt&quot;)<br />);<br />Taskbar.JumpList.RefreshTaskbarList();<br />
  13. 13. 註冊程式與副檔名的對應<br />
  14. 14. 工作列文件與工作清單<br />
  15. 15. 即時視窗預覽縮圖<br />Windows Vista: 每 個視窗一個<br />Windows 7: 使用縮圖群組<br />
  16. 16. 明確顯示部份內容<br />與其顯示整個畫面,但是卻不清楚<br />不如只顯示其中最重要的部份<br />
  17. 17. 設定工作列縮圖<br />// 設定縮圖來源區塊<br />Taskbar.TabbedThumbnail.SetThumbnailClip(<br />this.Handle, <br /> new Rectangle(<br /> pictureBox1.Location, pictureBox1.Size<br /> )<br />);<br />
  18. 18. 工作列縮圖<br />
  19. 19. MDI / TDI 視窗切換器<br />
  20. 20. 設定分頁縮圖<br />void UpdatePreviewBitmap(TabPage tabPage) {<br /> if (tabPage != null) {<br /> TabbedThumbnailPreview preview =<br /> Taskbar.TabbedThumbnail.GetThumbnailPreview(tabPage);<br /> if (preview != null) {<br /> Bitmap bitmap =<br /> ScreenCapture.GrabWindowBitmap(<br /> tabPage.Handle, tabPage.Size);<br /> preview.SetImage(bitmap);<br /> }<br /> }<br />}<br />
  21. 21. 分頁事件<br />Taskbar.TabbedThumbnail的事件<br />TabbedThumbnailClosed<br />TabbedThumbnailActivated<br />TabbedThumbnailMaximized<br />TabbedThumbnailMinimized<br />Taskbar.TabbedThumbnail.TabbedThumbnailClosed += <br /> new EventHandler&lt;TabbedThumbnailEventArgs&gt;(<br /> TabbedThumbnail_TabbedThumbnailClosed<br /> );<br />
  22. 22. 縮圖工具列<br />允許直接在工作列上操作應用程式<br />
  23. 23. 定義縮圖工具列按鈕<br />ThumbnailButton thumbButtonBack =<br /> new ThumbnailButton(<br /> Properties.Resources.prevArrow, &quot;Back“<br /> );<br />thumbButtonForward.Click += new <br /> EventHandler(thumbButtonForward_Click);<br />Taskbar.ThumbnailToolbars.AddButtons(<br /> newTab.Handle, <br /> thumbButtonBack, <br /> thumbButtonForward, <br /> thumbButtonRefresh<br />);<br />
  24. 24. 分頁縮圖與縮圖工具列<br />
  25. 25. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  26. 26. ExplorerBrowser控制項<br />explorerBrowser1.Navigate(<br /> ShellFolder.FromParsingName(&quot;C:indowsystem32&quot;)<br />);<br />
  27. 27. KnownFolder<br />// Windows Form<br />explorerBrowser1.Navigate(<br /> KnownFolders.Games as ShellObject );<br />// WPF<br />explorerBrowser1.NavigationTarget = <br /> KnownFolders.Games as ShellObject;<br />
  28. 28. ExplorerBrowser控制項<br />CommonOpenFileDialog dialog = new CommonOpenFileDialog();<br />dialog.FoldersOnly = true;<br />if (dialog.ShowDialog().Canceled == false)<br /> txtPath.Text = ((ShellFolder)dialog.Item).ParsingName;<br />
  29. 29. ExplorerBrowser與新檔案對話方塊<br />ExplorerBrowser – WinForm<br />ExplorerBrowser – WPF<br />已知資料夾瀏覽<br />樹狀瀏覽<br />
  30. 30. 取得檔案屬性<br />IShellProperty prop = ShellObject.FromParsingName(fileName)<br /> .Properties.GetProperty(propertyName);<br />string value = prop.ValueAsObject == null ? &quot;&quot; : prop.FormatForDisplay(PropertyDescriptionFormat.Default);<br />Console.WriteLine(&quot;{0} = {1}&quot;, prop.CanonicalName, value);<br />
  31. 31. 設定檔案屬性<br />IShellProperty prop = ShellObject.FromParsingName(fileName)<br /> .Properties.GetProperty(propertyName);<br />if (prop.ValueType == typeof(short?))<br />{<br /> (prop as ShellProperty&lt;short?&gt;).Value = short.Parse(value);<br />}<br />
  32. 32. 檔案屬性編輯<br />
  33. 33. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  34. 34. 媒體櫃概觀<br />在之前的 Windows 中,使用者將檔案儲存在已知路徑的資料夾中,<br />文件夾、…<br />至少有兩個資料夾路徑<br />個人資料夾<br />公用資料夾<br />
  35. 35. 媒體櫃的定義<br />“ 媒體櫃是一個集合、集中包含了來自不同位置的文件,使用者可以透過媒體櫃來組織尋找文件。”<br />
  36. 36. 媒體櫃管理介面<br />
  37. 37. 媒體櫃定義檔<br />XML 檔案格式<br />副檔名為 .library-ms<br />位於以下路徑中<br />C:Users[UserName]AppDataRoamingMicrosoftWindowsLibraries<br />
  38. 38.
  39. 39. 建立媒體櫃<br />// 建立新的媒體櫃<br />ShellLibrary library = new ShellLibrary(&quot;Hello&quot;, true);<br />library.Add(@&quot;D:MP3&quot;);<br />library.Add(@&quot;D:Source&quot;);<br />library.Close();<br />// 編輯媒體櫃<br />ShellLibrary lib = ShellLibrary.Load(&quot;Hello&quot;, false);<br />lib.Remove(@&quot;D:MP3&quot;);<br />lib.Add(@&quot;D:Drivers&quot;);<br />lib.Close();<br />
  40. 40. 媒體櫃選取<br />
  41. 41. 搜尋連接器跨多重來源的搜尋<br />SharePoint 文件庫<br />企業資料來源<br />多重搜尋來源<br />企業應用程式<br />
  42. 42. 搜尋連接器運作機制<br />豐富的搜尋經驗<br />預覽、metadata、拖曳<br />檔案總管的操作方式<br />簡單、輕量化整合<br />不需要安裝任何用戶端程式碼<br />支援任何平台<br />支援相關標準<br />OpenSearch 1.1<br />RSS, ATOM<br />身份驗證<br />整合式、自訂<br />Windows 透過 HTTP 傳送搜尋要求<br />1. 安裝搜尋連接器 (.osdx)<br />3. 伺服器傳回 RSS<br />
  43. 43. Open Search .osdx 檔格式<br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;OpenSearchDescriptionxmlns=&quot;http://a9.com/- /spec/opensearch/1.1/&quot; xmlns:ms-ose= &quot;http://schemas.microsoft.com/opensearchext/2009/&quot;&gt;<br /> &lt;ShortName&gt;Technet&lt;/ShortName&gt;<br /> &lt;Description&gt;OpenSearch for Technet&lt;/Description&gt;<br /> &lt;Url type=&quot;application/rss+xml“ template=&quot;http://social.technet.microsoft.com/Search/ Feed.aspx? Query={searchTerms}&quot;/&gt;<br />&lt;/OpenSearchDescription&gt;<br />
  44. 44. 搜尋連接器<br />
  45. 45. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  46. 46. 節省 CPU 電力電力狀態讀取<br />避免讀取電腦電力狀態 – 使用事件<br />每秒鐘不取得超過一次的電源狀態<br />不直接取得電源狀態<br />RegisterPowerSettingNotification<br />使用聯合計數器 (coalescing timers)<br />呼叫 SetWaitableTimerEx (含 delay tolerance 參數)<br />計數器週期<br />15.6 ms<br />Vista<br />週期性計數器事件<br />Windows 7<br />
  47. 47. 電力設定通知<br />PowerManager.PowerSourceChanged +=<br /> delegate {<br /> // 使用PowerManager.PowerSource<br /> };<br />/* 其它 PowerManager方法/屬性:<br />PowerManager.IsBatteryPresent<br />PowerManager.BatteryLifePercent<br /> … 等等 */<br />
  48. 48. 聯合計數器 (Coalescing Timer)<br />CoalescingTimer t =<br /> new CoalescingTimer(&quot;Name&quot;);<br />t.Tick += delegate { ... };<br />//Due time, period, reason, delay<br />t.Set(0, 1000, &quot;Reason&quot;, 50);<br />
  49. 49. 節省 CPU 電力多媒體計數器<br />多媒體計數器可以透過修改計數器間格來達到更好的效能<br />在多處理器上預設是: 15.6ms<br />視需要調整,可以調到 1ms、甚至更小<br />建議不要低於 10ms<br />否則會嚴重耗損電力<br />尤其是使用電池供電時<br />
  50. 50. 節省 CPU 電力動畫處理<br />動畫會加重 CPU 和 GPU 的電力使用<br />在系統閒置時避免動畫處理<br />通知區域的圖示動畫<br />Flash 撥放器就算最小化,一樣會使用 CPU<br />當電源計劃啓用、而且是使用電池供電時停用所有動畫<br />
  51. 51. 節省硬碟電力<br />空轉的硬碟會浪費將近 8% 的電力<br />在系統閒置時<br />避免週期性的磁碟存取<br />避免系統登錄 (registry) 的存取<br />最佳範例<br />Office Word 2007 每隔 5~15 分鐘自動存檔一次<br />如果文件沒有任何變動,就不會進行儲存<br />
  52. 52. 背景活動<br />將工作使用背景服務來處理<br />背景活動 (工作、服務) 可以依照不同環境進行排程<br />有 AC 電源時才啓動工作<br />檔使用電池時就暫停工作<br />有需要服務時才去啓動服務<br />請參閱 “Background Services” 投影片<br />
  53. 53. 不要防礙電源轉移<br />如果使用者觸發睡眠模式<br />任何程式都不能阻止進入睡眠模式<br />停止任何硬體動作 (網路傳輸、檔案複製、…)<br />從睡眠模式還原時:<br />恢復相關變動 (網路)<br />所有應用程式同時恢復 (可能會有資源瓶頸)<br />在系統啓動與關機時,使用相同的準則<br />包含休眠 / 復原<br />
  54. 54. 電力可用性要求<br />應用程式可以延遲自動睡眠<br />例如: 正在下載檔案、錄製電視節目、燒錄光碟<br />呼叫舊的 API: SetThreadExecutionState<br />Windows 7 使用新的 API:<br />PowerCreateRequest<br />參數中多了延遲的原因<br />IT 人員可以透過以下指令取得相關資訊:<br />powercfg.exe /requests<br />
  55. 55. 電力可用性要求 Managed Code<br />PowerAvailability.CreateRequest(<br /> &quot;My Reason&quot;,<br />PowerRequestType.DisplayRequired);<br />
  56. 56. 電力使用效率診斷<br />Windows 效能計數器<br />Windows Performance Toolkit (xperf)<br />在 Windows 7 中可以產生電力使用效率報表<br />powercfg.exe /energy<br />系統閒置時會自動執行,並回報給微軟 CEIP (Customer Experience Improvement Program)<br />
  57. 57. 電源管理<br />
  58. 58. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  59. 59. Windows 7 繪圖平台<br />Applications<br />Windows Paint<br />3rd party<br />Taskbar<br />Frameworks<br />Ribbon<br />Animation<br />WPF<br />原生平台<br />
  60. 60. Windows 7 Graphic Platform Overview<br />WIC<br />DWM<br />Direct2D<br />Direct<br />Write<br />DXVA<br />Direct3D 11<br />Direct3D 10<br />GDI+<br />DXGI<br />Direct3D9<br />USER<br />GDI<br />Win32K<br />DXGKernel<br />Windows 7 新增<br />Windows Vista<br />
  61. 61. Direct2D 架構<br />Application<br />Application<br />Direct2D<br />Direct3D<br />Software rasterizer<br />DXGI<br />
  62. 62. Windows 7 繪圖 API 整合<br />Windows Vista<br />Windows 7<br />//DX Code<br />CreateRenderTarget()<br />Draw()<br />Present()<br />// GDI Code<br />GetDC()<br />DrawLine()<br />ReleaseDC()<br />Copy 1<br />Copy 2<br />
  63. 63. Direct2D 與 Direct3D 整合<br />使用 Direct3D 10 或 10Level9 裝置<br />對應 D3D 平面到 D2D render target<br />CreateDxgiSurfaceRenderTarget()<br />在呼叫之前Present() 呼叫EndDraw()<br />在任何硬體組態設定下都可以運作<br />最好使用 WDDM 1.1 驅動程式和 DX10 GPU<br />
  64. 64. Direct2D 繪圖<br />D2DFactory d2dFactory = D2DFactory.CreateFactory(D2DFactoryType.SingleThreaded);<br />SizeUsize = new SizeU((uint)renderControl.ClientSize.Width, (uint)renderControl.ClientSize.Height);<br />RenderTargetPropertiesprops = new RenderTargetProperties();<br />HwndRenderTargetPropertieshwndProps = new HwndRenderTargetProperties(renderControl.Handle, size, PresentOptions.None);<br />HwndRenderTargetrenderTarget = d2dFactory.CreateHwndRenderTarget(props, hwndProps);<br />
  65. 65. Direct2D 繪圖<br />Point2F p1 = new Point2F(10, 10);<br />Point2F p2 = new Point2F(400, 300);<br />Brush b = renderTarget.CreateSolidColorBrush( new ColorF(0, 0, 0, 1));<br />renderTarget.BeginDraw();<br />renderTarget.Clear(new ColorF(1, 1, 1, 0));<br />renderTarget.DrawLine(p1, p2, b, 2);<br />renderTarget.EndDraw();<br />
  66. 66. Text Positioning<br />Can start glyphs at a sub-pixel boundary<br />在字母之間Enables more even spacing between glyphs<br />Smoother scrolling and text rotation<br />
  67. 67. ClearType<br />在 GDI 中 ClearType只能用在 X 方向<br />DirectWrite可以同時用在 X 和 Y 兩個方向<br />
  68. 68. DirectWrite<br />DWriteFactorydwriteFactory = DWriteFactory.CreateFactory();<br />SizeUsize = new SizeU((uint)renderControl.ClientSize.Width, (uint)renderControl.ClientSize.Height);<br />RenderTargetPropertiesprops = new RenderTargetProperties();<br />HwndRenderTargetPropertieshwndProps = new HwndRenderTargetProperties(renderControl.Handle, size, PresentOptions.None);<br />HwndRenderTargetrenderTarget = d2dFactory.CreateHwndRenderTarget(props, hwndProps);<br />
  69. 69. DirectWrite<br />TextFormattextFormat= dwriteFactory.CreateTextFormat(<br />“Arial”, 24, FontWeight.Bold, FontStyle.Italic,<br />FontStretch.Normal, &quot;&quot;);<br />TextLayouttextLayout = dwriteFactory.CreateTextLayout( “Hello”, textFormat, 100, 100);<br />Point2F p = new Point2F(10, 10);<br />Brush b = renderTarget.CreateSolidColorBrush( new ColorF(0, 0, 0, 1));<br />renderTarget.BeginDraw();<br />renderTarget.Clear(new ColorF(1, 1, 1, 0));<br />renderTarget.DrawTextLayout(p, textLayout, b);<br />renderTarget.EndDraw();<br />
  70. 70. Direct2D & DirectWrite<br />
  71. 71. 大綱<br />工作列程式設計<br />ExplorerBrowser控制項與通用檔案對話方塊<br />媒體櫃與搜尋連接器設計<br />如何用 .NET 程式控制 Windows 7 電源管理<br />繪圖 -- Direct2D、DirectWrite<br />應用程式如何支援重新啓動與自我修復功能<br />
  72. 72. 重新啓動與自我修復<br />當應用程式當掉時,Windows 7 的 WER (Windows Error Reporting Service) 會進行錯誤回報,並檢查可用的解決方案<br />72 / 36<br />
  73. 73. 重新啓動與自我修復<br />應用程式可以事先向 WER 註冊,以便由 WER 來重新啓動應用程式<br />73 / 36<br />
  74. 74. 註冊自我修復<br />private void RegisterForRecovery()<br />{<br /> // 設定應用程式當掉之前,<br /> // WER 要呼叫 RecoveryProcedure<br />RecoveryDatadata = new RecoveryData( new RecoveryCallback(RecoveryProcedure), null);<br />RecoverySettingssettings = new RecoverySettings(data, 0);<br />ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(settings);<br />}<br />
  75. 75. 註冊自我修復<br />private intRecoveryProcedure(object state)<br />{<br />PingSystem();<br /> // 儲存將來要復原用的資料<br /> // ….<br />ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true);<br /> return 0;<br />}<br />
  76. 76. 註冊自我修復<br />private void PingSystem()<br />{<br /> // 檢查使用者是否取消重新啓動<br />boolisCanceled = ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress();<br /> if (isCanceled)<br /> {<br />Environment.Exit(2);<br /> }<br />}<br />
  77. 77. 註冊重新啓動<br />讓 WER 知道要帶什麼參數來重新啓動應用程式,例如 /restart<br />指定例外狀況,例如重新開機、應用程式修正時不要重新啓動應用程式<br />ApplicationRestartRecoveryManager.RegisterForApplicationRestart(<br /> new RestartSettings(&quot;/restart&quot;,RestartRestrictions.NotOnReboot| RestartRestrictions.NotOnPatch)<br />);<br />
  78. 78. 註冊重新啓動<br />應用程式一開始必須檢查是否有帶 /restart 參數,如果有代表是 WER 呼叫<br />進行修復動作,例如將當掉之前的檔案載入<br />if (System.Environment.GetCommandLineArgs().Length &gt; 1 &&System.Environment.GetCommandLineArgs()[1] == &quot;/restart&quot;)<br />{<br />RecoverLastSession(System.Environment.GetCommandLineArgs()[1]<br /> );<br />}<br />
  79. 79. 重新啓動與自我修復<br />
  80. 80. 總結<br />Windows API Code Pack for Microsoft .NET Framework<br />簡化 .NET 應用程式與 Windows 7 新功能整合的工作<br />底層仍是 COM 元件或作業系統 API 呼叫<br />應用程式要自行檢查目前的環境是不是 Windows 7<br />預告 – Tech Days 2009 9/22~9/24<br />Windows 7 多點觸控應用程式設計入門<br />新世代的 Windows 與 Web 應用程式開發 -- WPF 4.0<br />
  81. 81. 相關資訊<br />聖哥的資訊站<br />http://teacher.syset.com<br />MSDN<br />http://www.microsoft.com/msdn<br />http://www.microsoft.com/taiwan/msdn<br />Windows 7 API Code Pack <br />http://code.msdn.microsoft.com/WindowsAPICodePack<br />
  82. 82. © 2001 Microsoft Corporation. All rights reserved.<br />

×