每周源代码 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功能的帖子了,所以昨晚把这个做好了,今早又把它贴到codeplexhttp://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在他博客很好地写了关于WPF4Windows 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

Comments (0)

Skip to main content