diff --git a/NUS Downloader/COMTypes.cs b/NUS Downloader/COMTypes.cs new file mode 100644 index 0000000..49e79e0 --- /dev/null +++ b/NUS Downloader/COMTypes.cs @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. + +using System; +using System.Runtime.InteropServices; + +namespace wyDay.Controls +{ + /// + /// Represents the thumbnail progress bar state. + /// + public enum ThumbnailProgressState + { + /// + /// No progress is displayed. + /// + NoProgress = 0, + /// + /// The progress is indeterminate (marquee). + /// + Indeterminate = 0x1, + /// + /// Normal progress is displayed. + /// + Normal = 0x2, + /// + /// An error occurred (red). + /// + Error = 0x4, + /// + /// The operation is paused (yellow). + /// + Paused = 0x8 + } + + //Based on Rob Jarett's wrappers for the desktop integration PDC demos. + [ComImportAttribute()] + [GuidAttribute("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + internal interface ITaskbarList3 + { + // ITaskbarList + [PreserveSig] + void HrInit(); + [PreserveSig] + void AddTab(IntPtr hwnd); + [PreserveSig] + void DeleteTab(IntPtr hwnd); + [PreserveSig] + void ActivateTab(IntPtr hwnd); + [PreserveSig] + void SetActiveAlt(IntPtr hwnd); + + // ITaskbarList2 + [PreserveSig] + void MarkFullscreenWindow( + IntPtr hwnd, + [MarshalAs(UnmanagedType.Bool)] bool fFullscreen); + + // ITaskbarList3 + void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal); + void SetProgressState(IntPtr hwnd, ThumbnailProgressState tbpFlags); + + // yadda, yadda - there's more to the interface, but we don't need it. + } + + [GuidAttribute("56FDF344-FD6D-11d0-958A-006097C9A090")] + [ClassInterfaceAttribute(ClassInterfaceType.None)] + [ComImportAttribute()] + internal class CTaskbarList { } +} \ No newline at end of file diff --git a/NUS Downloader/Form1.Designer.cs b/NUS Downloader/Form1.Designer.cs index cca411d..2076d72 100644 --- a/NUS Downloader/Form1.Designer.cs +++ b/NUS Downloader/Form1.Designer.cs @@ -35,7 +35,6 @@ this.downloadstartbtn = new System.Windows.Forms.Button(); this.statusbox = new System.Windows.Forms.TextBox(); this.packbox = new System.Windows.Forms.CheckBox(); - this.dlprogress = new System.Windows.Forms.ProgressBar(); this.localuse = new System.Windows.Forms.CheckBox(); this.NUSDownloader = new System.ComponentModel.BackgroundWorker(); this.titleversion = new System.Windows.Forms.TextBox(); @@ -96,8 +95,15 @@ this.button3 = new System.Windows.Forms.Button(); this.contentsEdit = new System.Windows.Forms.ListBox(); this.contentModBox = new System.Windows.Forms.GroupBox(); + this.button16 = new System.Windows.Forms.Button(); + this.button13 = new System.Windows.Forms.Button(); this.button15 = new System.Windows.Forms.Button(); this.button14 = new System.Windows.Forms.Button(); + this.button12 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); this.button17 = new System.Windows.Forms.Button(); this.extrasStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.loadInfoFromTMDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -116,21 +122,15 @@ this.label12 = new System.Windows.Forms.Label(); this.ProxyUser = new System.Windows.Forms.TextBox(); this.SaveProxyBtn = new System.Windows.Forms.Button(); - this.ProxyURL = new System.Windows.Forms.TextBox(); this.ProxyAssistBtn = new System.Windows.Forms.Button(); - this.button16 = new System.Windows.Forms.Button(); - this.button13 = new System.Windows.Forms.Button(); - this.button12 = new System.Windows.Forms.Button(); - this.button8 = new System.Windows.Forms.Button(); - this.button11 = new System.Windows.Forms.Button(); - this.button9 = new System.Windows.Forms.Button(); - this.button10 = new System.Windows.Forms.Button(); + this.ProxyURL = new System.Windows.Forms.TextBox(); this.radioButton1 = new System.Windows.Forms.RadioButton(); this.radioButton2 = new System.Windows.Forms.RadioButton(); this.ProxyVerifyBox = new System.Windows.Forms.GroupBox(); + this.SaveProxyPwdBtn = new System.Windows.Forms.Button(); this.label14 = new System.Windows.Forms.Label(); this.ProxyPwdBox = new System.Windows.Forms.TextBox(); - this.SaveProxyPwdBtn = new System.Windows.Forms.Button(); + this.dlprogress = new wyDay.Controls.Windows7ProgressBar(); this.databaseStrip.SuspendLayout(); this.tmdgpbox.SuspendLayout(); this.ticketgpbox.SuspendLayout(); @@ -195,14 +195,6 @@ this.packbox.CheckedChanged += new System.EventHandler(this.packbox_CheckedChanged); this.packbox.EnabledChanged += new System.EventHandler(this.packbox_EnabledChanged); // - // dlprogress - // - this.dlprogress.Location = new System.Drawing.Point(12, 95); - this.dlprogress.Name = "dlprogress"; - this.dlprogress.Size = new System.Drawing.Size(250, 15); - this.dlprogress.Style = System.Windows.Forms.ProgressBarStyle.Continuous; - this.dlprogress.TabIndex = 7; - // // localuse // this.localuse.AutoSize = true; @@ -770,6 +762,28 @@ this.contentModBox.Text = "Edit Title Contents"; this.contentModBox.Visible = false; // + // button16 + // + this.button16.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button16.Image = global::NUS_Downloader.Properties.Resources.bug_add; + this.button16.Location = new System.Drawing.Point(136, 198); + this.button16.Name = "button16"; + this.button16.Size = new System.Drawing.Size(26, 26); + this.button16.TabIndex = 44; + this.button16.UseVisualStyleBackColor = true; + this.button16.Click += new System.EventHandler(this.button16_Click); + // + // button13 + // + this.button13.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button13.Image = global::NUS_Downloader.Properties.Resources.link; + this.button13.Location = new System.Drawing.Point(104, 198); + this.button13.Name = "button13"; + this.button13.Size = new System.Drawing.Size(26, 26); + this.button13.TabIndex = 43; + this.button13.UseVisualStyleBackColor = true; + this.button13.Click += new System.EventHandler(this.button13_Click); + // // button15 // this.button15.FlatStyle = System.Windows.Forms.FlatStyle.Popup; @@ -792,6 +806,61 @@ this.button14.UseVisualStyleBackColor = true; this.button14.Click += new System.EventHandler(this.button14_Click); // + // button12 + // + this.button12.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button12.Image = ((System.Drawing.Image)(resources.GetObject("button12.Image"))); + this.button12.Location = new System.Drawing.Point(72, 198); + this.button12.Name = "button12"; + this.button12.Size = new System.Drawing.Size(26, 26); + this.button12.TabIndex = 40; + this.button12.UseVisualStyleBackColor = true; + this.button12.Click += new System.EventHandler(this.button12_Click); + // + // button8 + // + this.button8.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button8.Image = ((System.Drawing.Image)(resources.GetObject("button8.Image"))); + this.button8.Location = new System.Drawing.Point(213, 19); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(26, 26); + this.button8.TabIndex = 33; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // button11 + // + this.button11.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button11.Image = ((System.Drawing.Image)(resources.GetObject("button11.Image"))); + this.button11.Location = new System.Drawing.Point(9, 198); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(26, 26); + this.button11.TabIndex = 36; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.button11_Click); + // + // button9 + // + this.button9.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button9.Image = ((System.Drawing.Image)(resources.GetObject("button9.Image"))); + this.button9.Location = new System.Drawing.Point(213, 53); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(26, 26); + this.button9.TabIndex = 34; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.button9_Click); + // + // button10 + // + this.button10.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.button10.Image = ((System.Drawing.Image)(resources.GetObject("button10.Image"))); + this.button10.Location = new System.Drawing.Point(41, 198); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(26, 26); + this.button10.TabIndex = 35; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.button10_Click); + // // button17 // this.button17.FlatStyle = System.Windows.Forms.FlatStyle.Popup; @@ -952,14 +1021,6 @@ this.SaveProxyBtn.UseVisualStyleBackColor = true; this.SaveProxyBtn.Click += new System.EventHandler(this.SaveProxyBtn_Click); // - // ProxyURL - // - this.ProxyURL.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.ProxyURL.Location = new System.Drawing.Point(55, 27); - this.ProxyURL.Name = "ProxyURL"; - this.ProxyURL.Size = new System.Drawing.Size(151, 20); - this.ProxyURL.TabIndex = 0; - // // ProxyAssistBtn // this.ProxyAssistBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; @@ -969,83 +1030,15 @@ this.ProxyAssistBtn.Size = new System.Drawing.Size(29, 26); this.ProxyAssistBtn.TabIndex = 28; this.ProxyAssistBtn.UseVisualStyleBackColor = true; + this.ProxyAssistBtn.Click += new System.EventHandler(this.ProxyAssistBtn_Click); // - // button16 + // ProxyURL // - this.button16.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button16.Image = global::NUS_Downloader.Properties.Resources.bug_add; - this.button16.Location = new System.Drawing.Point(136, 198); - this.button16.Name = "button16"; - this.button16.Size = new System.Drawing.Size(26, 26); - this.button16.TabIndex = 44; - this.button16.UseVisualStyleBackColor = true; - this.button16.Click += new System.EventHandler(this.button16_Click); - // - // button13 - // - this.button13.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button13.Image = global::NUS_Downloader.Properties.Resources.link; - this.button13.Location = new System.Drawing.Point(104, 198); - this.button13.Name = "button13"; - this.button13.Size = new System.Drawing.Size(26, 26); - this.button13.TabIndex = 43; - this.button13.UseVisualStyleBackColor = true; - this.button13.Click += new System.EventHandler(this.button13_Click); - // - // button12 - // - this.button12.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button12.Image = ((System.Drawing.Image)(resources.GetObject("button12.Image"))); - this.button12.Location = new System.Drawing.Point(72, 198); - this.button12.Name = "button12"; - this.button12.Size = new System.Drawing.Size(26, 26); - this.button12.TabIndex = 40; - this.button12.UseVisualStyleBackColor = true; - this.button12.Click += new System.EventHandler(this.button12_Click); - // - // button8 - // - this.button8.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button8.Image = ((System.Drawing.Image)(resources.GetObject("button8.Image"))); - this.button8.Location = new System.Drawing.Point(213, 19); - this.button8.Name = "button8"; - this.button8.Size = new System.Drawing.Size(26, 26); - this.button8.TabIndex = 33; - this.button8.UseVisualStyleBackColor = true; - this.button8.Click += new System.EventHandler(this.button8_Click); - // - // button11 - // - this.button11.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button11.Image = ((System.Drawing.Image)(resources.GetObject("button11.Image"))); - this.button11.Location = new System.Drawing.Point(9, 198); - this.button11.Name = "button11"; - this.button11.Size = new System.Drawing.Size(26, 26); - this.button11.TabIndex = 36; - this.button11.UseVisualStyleBackColor = true; - this.button11.Click += new System.EventHandler(this.button11_Click); - // - // button9 - // - this.button9.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button9.Image = ((System.Drawing.Image)(resources.GetObject("button9.Image"))); - this.button9.Location = new System.Drawing.Point(213, 53); - this.button9.Name = "button9"; - this.button9.Size = new System.Drawing.Size(26, 26); - this.button9.TabIndex = 34; - this.button9.UseVisualStyleBackColor = true; - this.button9.Click += new System.EventHandler(this.button9_Click); - // - // button10 - // - this.button10.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.button10.Image = ((System.Drawing.Image)(resources.GetObject("button10.Image"))); - this.button10.Location = new System.Drawing.Point(41, 198); - this.button10.Name = "button10"; - this.button10.Size = new System.Drawing.Size(26, 26); - this.button10.TabIndex = 35; - this.button10.UseVisualStyleBackColor = true; - this.button10.Click += new System.EventHandler(this.button10_Click); + this.ProxyURL.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.ProxyURL.Location = new System.Drawing.Point(55, 27); + this.ProxyURL.Name = "ProxyURL"; + this.ProxyURL.Size = new System.Drawing.Size(151, 20); + this.ProxyURL.TabIndex = 0; // // radioButton1 // @@ -1085,6 +1078,17 @@ this.ProxyVerifyBox.Text = "Verify Credentials"; this.ProxyVerifyBox.Visible = false; // + // SaveProxyPwdBtn + // + this.SaveProxyPwdBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.SaveProxyPwdBtn.Location = new System.Drawing.Point(9, 43); + this.SaveProxyPwdBtn.Name = "SaveProxyPwdBtn"; + this.SaveProxyPwdBtn.Size = new System.Drawing.Size(197, 23); + this.SaveProxyPwdBtn.TabIndex = 34; + this.SaveProxyPwdBtn.Text = "Save (This Session Only)"; + this.SaveProxyPwdBtn.UseVisualStyleBackColor = true; + this.SaveProxyPwdBtn.Click += new System.EventHandler(this.button18_Click); + // // label14 // this.label14.AutoSize = true; @@ -1104,22 +1108,20 @@ this.ProxyPwdBox.UseSystemPasswordChar = true; this.ProxyPwdBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ProxyPwdBox_KeyPress); // - // SaveProxyPwdBtn + // dlprogress // - this.SaveProxyPwdBtn.FlatStyle = System.Windows.Forms.FlatStyle.Popup; - this.SaveProxyPwdBtn.Location = new System.Drawing.Point(9, 43); - this.SaveProxyPwdBtn.Name = "SaveProxyPwdBtn"; - this.SaveProxyPwdBtn.Size = new System.Drawing.Size(197, 23); - this.SaveProxyPwdBtn.TabIndex = 34; - this.SaveProxyPwdBtn.Text = "Save (This Session Only)"; - this.SaveProxyPwdBtn.UseVisualStyleBackColor = true; - this.SaveProxyPwdBtn.Click += new System.EventHandler(this.button18_Click); + this.dlprogress.ContainerControl = this; + this.dlprogress.Location = new System.Drawing.Point(12, 95); + this.dlprogress.Name = "dlprogress"; + this.dlprogress.Size = new System.Drawing.Size(250, 15); + this.dlprogress.TabIndex = 47; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(539, 492); + this.Controls.Add(this.dlprogress); this.Controls.Add(this.deletecontentsbox); this.Controls.Add(this.button3); this.Controls.Add(this.ProxyVerifyBox); @@ -1144,7 +1146,6 @@ this.Controls.Add(this.button7); this.Controls.Add(this.radioButton1); this.Controls.Add(this.radioButton2); - this.Controls.Add(this.dlprogress); this.Controls.Add(this.packbox); this.Controls.Add(this.statusbox); this.Controls.Add(this.ignoreticket); @@ -1184,7 +1185,6 @@ private System.Windows.Forms.Button downloadstartbtn; private System.Windows.Forms.TextBox statusbox; private System.Windows.Forms.CheckBox packbox; - private System.Windows.Forms.ProgressBar dlprogress; private System.Windows.Forms.CheckBox localuse; private System.ComponentModel.BackgroundWorker NUSDownloader; private System.Windows.Forms.TextBox titleversion; @@ -1280,6 +1280,7 @@ private System.Windows.Forms.Button SaveProxyPwdBtn; private System.Windows.Forms.Label label14; private System.Windows.Forms.TextBox ProxyPwdBox; + private wyDay.Controls.Windows7ProgressBar dlprogress; } } diff --git a/NUS Downloader/Form1.cs b/NUS Downloader/Form1.cs index f6886ed..8091678 100644 --- a/NUS Downloader/Form1.cs +++ b/NUS Downloader/Form1.cs @@ -9,6 +9,7 @@ using System.Text.RegularExpressions; using System.ComponentModel; using System.Threading; using System.Text; +using wyDay.Controls; namespace NUS_Downloader @@ -47,6 +48,9 @@ namespace NUS_Downloader string proxy_url; string proxy_usr; string proxy_pwd; + + // Common Key hash + byte[] wii_commonkey_sha1 = new byte[20] { 0xEB, 0xEA, 0xE6, 0xD2, 0x76, 0x2D, 0x4D, 0x3E, 0xA1, 0x60, 0xA6, 0xD8, 0x32, 0x7F, 0xAC, 0x9A, 0x25, 0xF8, 0x06, 0x2B }; /* public struct WADHeader { @@ -195,6 +199,8 @@ namespace NUS_Downloader else { WriteStatus("Common Key detected."); + if ((Convert.ToBase64String(ComputeSHA(LoadCommonKey("key.bin")))) != (Convert.ToBase64String(wii_commonkey_sha1))) + WriteStatus(" - (PS: Your common key isn't hashing right!"); } // Check for Wii KOR common key bin file... @@ -793,6 +799,14 @@ namespace NUS_Downloader downloadstartbtn.Text = "Prerequisites: (0/2)"; + // Windows 7? + if (IsWin7()) + { + // Windows 7 Taskbar progress can be used. + dlprogress.ShowInTaskbar = true; + + } + // Download TMD before the rest... string tmdfull = "tmd"; if (titleversion.Text != "") @@ -1152,6 +1166,9 @@ namespace NUS_Downloader SetEnableforDownload(true); downloadstartbtn.Text = "Start NUS Download!"; dlprogress.Value = 0; + + if (IsWin7()) + dlprogress.ShowInTaskbar = false; } @@ -1442,8 +1459,8 @@ namespace NUS_Downloader else WriteStatus("Database: OK"); - /* if (IsWin7()) - WriteStatus("Windows 7 Features: Enabled"); */ + if (IsWin7()) + WriteStatus("Windows 7 Features: Enabled"); WriteStatus(""); WriteStatus("Special thanks to:"); @@ -1453,6 +1470,7 @@ namespace NUS_Downloader WriteStatus(" * #WiiDev for answering the tough questions."); WriteStatus(" * Anyone who helped beta test on GBATemp!"); WriteStatus(" * Famfamfam for the Silk Icon Set."); + WriteStatus(" * Wyatt O'Day for the Windows7ProgressBar Control."); } private void packbox_CheckedChanged(object sender, EventArgs e) @@ -3763,5 +3781,12 @@ namespace NUS_Downloader if (e.KeyChar == Convert.ToChar(Keys.Enter)) button18_Click("LOLWUT", EventArgs.Empty); } + + private void ProxyAssistBtn_Click(object sender, EventArgs e) + { + MessageBox.Show("If you are behind a proxy, set these settings to get through to NUS." + + " If you have an alternate port for accessing your proxy, add ':' followed by the port." + + " You will be prompted for your password each time you run NUSD, for privacy purposes."); + } } } diff --git a/NUS Downloader/Form1.resx b/NUS Downloader/Form1.resx index 8d50c9d..f8d0234 100644 --- a/NUS Downloader/Form1.resx +++ b/NUS Downloader/Form1.resx @@ -123,9 +123,6 @@ 159, 17 - - 285, 17 - @@ -209,6 +206,9 @@ c3rr+88Wyom3k23LfyYpTu77C4h89ngRLmtIAAAAAElFTkSuQmCC + + 285, 17 + iVBORw0KGgoAAAANSUhEUgAAADYAAAAZCAYAAAB6v90+AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH diff --git a/NUS Downloader/NUS Downloader.csproj b/NUS Downloader/NUS Downloader.csproj index 1ed2be8..bfd2612 100644 --- a/NUS Downloader/NUS Downloader.csproj +++ b/NUS Downloader/NUS Downloader.csproj @@ -61,9 +61,10 @@ + - Form PreserveNewest + Form Form1.cs @@ -96,6 +97,10 @@ True + + Component + + diff --git a/NUS Downloader/Windows7ProgressBar.cs b/NUS Downloader/Windows7ProgressBar.cs new file mode 100644 index 0000000..1153831 --- /dev/null +++ b/NUS Downloader/Windows7ProgressBar.cs @@ -0,0 +1,242 @@ +using System.ComponentModel; +using System.ComponentModel.Design; +using System.Drawing; +using System.Windows.Forms; + +//Windows7ProgressBar v1.0, created by Wyatt O'Day +//Visit: http://wyday.com/windows-7-progress-bar/ + +namespace wyDay.Controls +{ + /// + /// A Windows progress bar control with Windows Vista & 7 functionality. + /// + [ToolboxBitmap(typeof(ProgressBar))] + public class Windows7ProgressBar : ProgressBar + { + bool showInTaskbar; + private ProgressBarState m_State = ProgressBarState.Normal; + ContainerControl ownerForm; + + public Windows7ProgressBar () {} + + public Windows7ProgressBar(ContainerControl parentControl) + { + ContainerControl = parentControl; + } + public ContainerControl ContainerControl + { + get { return ownerForm; } + set + { + ownerForm = value; + + if(!ownerForm.Visible) + ((Form)ownerForm).Shown += Windows7ProgressBar_Shown; + } + } + public override ISite Site + { + set + { + // Runs at design time, ensures designer initializes ContainerControl + base.Site = value; + if (value == null) return; + IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost; + if (service == null) return; + IComponent rootComponent = service.RootComponent; + + ContainerControl = rootComponent as ContainerControl; + } + } + + void Windows7ProgressBar_Shown(object sender, System.EventArgs e) + { + if (ShowInTaskbar) + { + if (Style != ProgressBarStyle.Marquee) + SetValueInTB(); + + SetStateInTB(); + } + + ((Form)ownerForm).Shown -= Windows7ProgressBar_Shown; + } + + + + /// + /// Show progress in taskbar + /// + [DefaultValue(false)] + public bool ShowInTaskbar + { + get + { + return showInTaskbar; + } + set + { + if (showInTaskbar != value) + { + showInTaskbar = value; + + // send signal to the taskbar. + if (ownerForm != null) + { + if (Style != ProgressBarStyle.Marquee) + SetValueInTB(); + + SetStateInTB(); + } + } + } + } + + + /// + /// Gets or sets the current position of the progress bar. + /// + /// The position within the range of the progress bar. The default is 0. + public new int Value + { + get + { + return base.Value; + } + set + { + base.Value = value; + + // send signal to the taskbar. + SetValueInTB(); + } + } + + /// + /// Gets or sets the manner in which progress should be indicated on the progress bar. + /// + /// One of the ProgressBarStyle values. The default is ProgressBarStyle.Blocks + public new ProgressBarStyle Style + { + get + { + return base.Style; + } + set + { + base.Style = value; + + // set the style of the progress bar + if (showInTaskbar && ownerForm != null) + { + SetStateInTB(); + } + } + } + + + /// + /// The progress bar state for Windows Vista & 7 + /// + [DefaultValue(ProgressBarState.Normal)] + public ProgressBarState State + { + get { return m_State; } + set + { + m_State = value; + + bool wasMarquee = Style == ProgressBarStyle.Marquee; + + if(wasMarquee) + // sets the state to normal (and implicity calls SetStateInTB() ) + Style = ProgressBarStyle.Blocks; + + // set the progress bar state (Normal, Error, Paused) + Windows7Taskbar.SendMessage(Handle, 0x410, (int)value, 0); + + + if (wasMarquee) + // the Taskbar PB value needs to be reset + SetValueInTB(); + else + // there wasn't a marquee, thus we need to update the taskbar + SetStateInTB(); + } + } + + /// + /// Advances the current position of the progress bar by the specified amount. + /// + /// The amount by which to increment the progress bar's current position. + public new void Increment(int value) + { + base.Increment(value); + + // send signal to the taskbar. + SetValueInTB(); + } + + /// + /// Advances the current position of the progress bar by the amount of the System.Windows.Forms.ProgressBar.Step property. + /// + public new void PerformStep() + { + base.PerformStep(); + + // send signal to the taskbar. + SetValueInTB(); + } + + private void SetValueInTB() + { + if (showInTaskbar) + { + ulong maximum = (ulong) (Maximum - Minimum); + ulong progress = (ulong) (Value - Minimum); + + Windows7Taskbar.SetProgressValue(ownerForm.Handle, progress, maximum); + } + } + + private void SetStateInTB() + { + if (ownerForm == null) return; + + ThumbnailProgressState thmState = ThumbnailProgressState.Normal; + + if (!showInTaskbar) + thmState = ThumbnailProgressState.NoProgress; + else if (Style == ProgressBarStyle.Marquee) + thmState = ThumbnailProgressState.Indeterminate; + else if (m_State == ProgressBarState.Error) + thmState = ThumbnailProgressState.Error; + else if (m_State == ProgressBarState.Pause) + thmState = ThumbnailProgressState.Paused; + + Windows7Taskbar.SetProgressState(ownerForm.Handle, thmState); + } + } + + /// + /// The progress bar state for Windows Vista & 7 + /// + public enum ProgressBarState + { + /// + /// Indicates normal progress + /// + Normal = 1, + + /// + /// Indicates an error in the progress + /// + Error = 2, + + /// + /// Indicates paused progress + /// + Pause = 3 + } +} \ No newline at end of file diff --git a/NUS Downloader/Windows7Taskbar.cs b/NUS Downloader/Windows7Taskbar.cs new file mode 100644 index 0000000..4f98787 --- /dev/null +++ b/NUS Downloader/Windows7Taskbar.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. + +using System; +using System.Runtime.InteropServices; + +namespace wyDay.Controls +{ + /// + /// The primary coordinator of the Windows 7 taskbar-related activities. + /// + public static class Windows7Taskbar + { + private static ITaskbarList3 _taskbarList; + internal static ITaskbarList3 TaskbarList + { + get + { + if (_taskbarList == null) + { + lock (typeof(Windows7Taskbar)) + { + if (_taskbarList == null) + { + _taskbarList = (ITaskbarList3)new CTaskbarList(); + _taskbarList.HrInit(); + } + } + } + return _taskbarList; + } + } + + static readonly OperatingSystem osInfo = Environment.OSVersion; + + internal static bool Windows7OrGreater + { + get + { + return (osInfo.Version.Major == 6 && osInfo.Version.Minor >= 1) + || (osInfo.Version.Major > 6); + } + } + + /// + /// Sets the progress state of the specified window's + /// taskbar button. + /// + /// The window handle. + /// The progress state. + public static void SetProgressState(IntPtr hwnd, ThumbnailProgressState state) + { + if(Windows7OrGreater) + TaskbarList.SetProgressState(hwnd, state); + } + /// + /// Sets the progress value of the specified window's + /// taskbar button. + /// + /// The window handle. + /// The current value. + /// The maximum value. + public static void SetProgressValue(IntPtr hwnd, ulong current, ulong maximum) + { + if(Windows7OrGreater) + TaskbarList.SetProgressValue(hwnd, current, maximum); + } + + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + internal static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam); + } +} \ No newline at end of file