每周源代码 46-Jeff Key摇动了Taskbar Meters,可监视你任务栏中的Win7 CPU,Memory和Disk

[原文发表地址] The Weekly Source Code 46 - Jeff Key rocks Taskbar Meters that Monitor your Windows 7 CPU and Memory and Disk in the Taskbar

[原文发表时间] 2009-10-29 07:44 PM

clip_image002

看事物流行起来很有意思,即使只是互联网上的一些传播。事情是这样的,但更重要的是,我们将要谈论代码。也让我们使之完全清楚,就是Jeff Key不稳定。看左边的图片,介于他的两个“跛脚”创作。

首先,本周前些时候我发了一个名叫“亮点: 使用Windows 7新功能的应用程序清单序”的帖子。一两天后,我从前室友和兼职belay (业余攀登牵引员)Jeff Key ( @JeffreyKey on Twitter ) 那收到即时信息(其实,那完全是一个谎言,但我和Jeff是多年的好友,在IM上有对方),信息说:

看到昨天你Win7功能的帖子了,所以昨晚把这个做好了,今早又把它贴到codeplex https://taskbarmeters.codeplex.com/ 有些烂,但我就是这么做的。

clip_image004

多年来,Jeff的口头禅就是“说话起来容易,给我看代码。”他确实就是这样做的,用一些最具启发性的. NET为基础的小程序,获得了我们永远的钦佩和感激。Jeff就是这样做的。我访问了他的CodePlex网站,发现它有11个下载。

clip_image005

我推特上说过这件事然后就忘了。后来那个推特被Download.com(我听说过,给Jeff全部荣誉)Life Rocks 2.0(我从没听说过,也从未有人获得过荣誉)以及Lifehacker(我在Life Rocks上听说过)引用。稍后,我返回到CodePlex,发现有4152个下载!恭喜Jeff如此“烂” !;)

clip_image006

代码

当人们为之疯狂并下载这个小实用程序的时候,Jeff本人为什么这么谦虚,说自己的代码“烂”?Well,因为做起来太简单了,这可能是强烈的内疚感。;) Windows API Code Pack让它变得简单。

此外: 实际上,.NET 4上的WPF让其更简单,因为它包含新的TaskbarItemInfo类,可以让你从XAML实现这点。来自我团队的Pete Brown在他博客很好地写了关于用WPF4在Windows 7 Taskbar上显示进度

首先,因为他的应用程序是针对Win7的,他先检查以确保可以继续。注意,很可能让应用程序很好的从XP转到Win7。但这些程序只是Win7的小展示,所以你应该明白他为什么要检查这些。

    1: 1
    2: 2
    3: 3
    4: 4
    5: 5    if (!TaskbarManager.IsPlatformSupported)
    6: {
    7:     MessageBox.Show("Sorry, but this app only works on Window 7.", "Aw snap!", MessageBoxButton.OK, MessageBoxImage.Error);
    8:     Application.Current.Shutdown();
    9: }

为了更新Taskbar (Superbar) Progress Bar ,他编写了一个小的帮助程序,因为他想根据CPU 或Memory的使用率值让颜色变为绿色,黄色或者红色。

    1: public void SetTaskBarStatus(int value)
    2: {
    3:     if (value < 0)
    4:     {
    5:         value = 0;
    6:     }
    7:     else if (value > 100)
    8:     {
    9:         value = 100;
   10:     }
   11:  
   12:     var state = TaskbarProgressBarState.Normal;
   13:  
   14:     if (value > _settings.Yellow)
   15:     {
   16:         state = value < _settings.Red ? TaskbarProgressBarState.Paused : TaskbarProgressBarState.Error;
   17:     }
   18:  
   19:     TaskbarManager.Instance.SetProgressState(state);
   20:     TaskbarManager.Instance.SetProgressValue(value, 100);
   21: }

然后他就设置一个小系统。Timer喜欢并合理地为Memory设置Progress Bar值……

    1: public partial class App : Application
    2: {
    3:     private ComputerInfo    _computerInfo;
    4:     private ulong            _totalPhysicalMemory;
    5:  
    6:     protected override void OnStartup(StartupEventArgs e)
    7:     {
    8:         base.OnStartup(e);
    9:  
   10:         _computerInfo = new ComputerInfo();
   11:         _totalPhysicalMemory = _computerInfo.TotalPhysicalMemory;
   12:  
   13:         var mainWindow = new MainWindow();
   14:         mainWindow.Tick += WhenTimerTick;
   15:         mainWindow.Show();
   16:     }
   17:  
   18:     private void WhenTimerTick(object sender, EventArgs e)
   19:     {
   20:         var available = (double)(_totalPhysicalMemory-_computerInfo.AvailablePhysicalMemory) / _totalPhysicalMemory;
   21:         ((MainWindow)sender).SetTaskBarStatus((int)(available * 100));
   22:     }
   23: }

或者CPU……

    1: public partial class App : Application
    2: {
    3:     private readonly PerformanceCounter _counter = new PerformanceCounter();
    4:  
    5:     protected override void OnStartup(StartupEventArgs e)
    6:     {
    7:         base.OnStartup(e);
    8:  
    9:         _counter.CategoryName = "Processor";
   10:         _counter.CounterName = "% Processor Time";
   11:         _counter.InstanceName = "_Total";
   12:  
   13:         var mainWindow = new MainWindow();
   14:         mainWindow.Tick += WhenTimerTick;
   15:         mainWindow.Show();
   16:     }
   17:  
   18:     private void WhenTimerTick(object sender, EventArgs e)
   19:     {
   20:         ((MainWindow)sender).SetTaskBarStatus((int)_counter.NextValue());
   21:     }
   22: }

为了右击即可启动Task Manager 或者 Resource Monitor, Jeff添加了一些JumpLists。做得很棒!这是一个亮点。

clip_image008

Windows API Code Pack.用Windows 7 APIs也很容易操作。

    1: var jumpList = JumpList.CreateJumpList();
    2: var systemFolder = Environment.GetFolderPath(Environment.SpecialFolder.System);
    3:  
    4: jumpList.AddUserTasks(new JumpListLink(Path.Combine(systemFolder, "taskmgr.exe"), "Open Task Manager")
    5: {
    6:       IconReference = new IconReference(Path.Combine(systemFolder, "taskmgr.exe"), 0)
    7: });
    8:  
    9: jumpList.AddUserTasks(new JumpListLink(Path.Combine(systemFolder, "perfmon.exe"), "Open Resource Monitor")
   10: {
   11:       IconReference = new IconReference(Path.Combine(systemFolder, "perfmon.exe"), 0),
   12:     Arguments = "/res"
   13: });
   14:  
   15: jumpList.Refresh();

不错,Jeff Key。你成功了。所以,亲爱的读者,在Win7下启动你的应用程序。尽情享受它的乐趣吧!

为Open Source Project打补丁并添加一个Disk IO Meter

一天后,@ScottMuc推特我说添加一个Disk IO Meter 我们在推特上交谈。最终他提交了一个补丁CodePlex.。尽管Jeff还没用那个补丁更新他的代码(或许他可以让我做管理员,我可以做这个),当然,我可以修补我的本地备份。

有用链接:例如:怎样添加一个补丁到Open Source Project

下载ScottMuc的补丁,右击(用Tortoise SVN),点击Apply Patch,这会呈现给我一个新的TaskbarDiskIOMeter项目,然后我可以将其添加到大一点的解决方案。补丁的唯一问题是它指向一个叫做Drive.ico的二进制文件,该文件不包含在.patch文件中。我找到一个并添加进去,现在我们也得到了一个Disk IO监控。:)

clip_image009

享受它吧!


1. 获取Windows 7 SDK

* Windows SDK

2. 开发、测试你的程序

* 获取 Windows API Code Pack

* 了解Application Compatibility

* 阅读 Windows 7 Application Quality Cookbook

* 下载 Windows 7 Training Kit for Developers

3. 获取 Windows 7 Logo

* 了解Pledge Program

* 获取 Windows 7 Logo

4. Windows 7点亮你的程序

* 阅读 Windows 7 开发指南

* 了解怎样 开发 Windows 7