每周源代码 46-Jeff Key摇动了Taskbar Meters,可监视你任务栏中的Win7 CPU,Memory和Disk
[原文发表时间] 2009-10-29 07:44 PM
看事物流行起来很有意思,即使只是互联网上的一些传播。事情是这样的,但更重要的是,我们将要谈论代码。也让我们使之完全清楚,就是Jeff Key不稳定。看左边的图片,介于他的两个“跛脚”创作。
首先,本周前些时候我发了一个名叫“亮点: 使用Windows 7新功能的应用程序清单序”的帖子。一两天后,我从前室友和兼职belay (业余攀登牵引员)Jeff Key ( @JeffreyKey on Twitter ) 那收到即时信息(其实,那完全是一个谎言,但我和Jeff是多年的好友,在IM上有对方),信息说:
看到昨天你Win7功能的帖子了,所以昨晚把这个做好了,今早又把它贴到codeplex : https://taskbarmeters.codeplex.com/ 有些烂,但我就是这么做的。
多年来,Jeff的口头禅就是“说话起来容易,给我看代码。”他确实就是这样做的,用一些最具启发性的. NET为基础的小程序,获得了我们永远的钦佩和感激。Jeff就是这样做的。我访问了他的CodePlex网站,发现它有11个下载。
我推特上说过这件事然后就忘了。后来那个推特被Download.com(我听说过,给Jeff全部荣誉)Life Rocks 2.0(我从没听说过,也从未有人获得过荣誉)以及Lifehacker(我在Life Rocks上听说过)引用。稍后,我返回到CodePlex,发现有4152个下载!恭喜Jeff如此“烂” !;)
代码
当人们为之疯狂并下载这个小实用程序的时候,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。做得很棒!这是一个亮点。
在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监控。:)
享受它吧!
1. 获取Windows 7 和 SDK
2. 开发、测试你的程序
阅读 Windows 7 Application Quality Cookbook
下载 Windows 7 Training Kit for Developers
3. 获取 Windows 7 Logo
4. 用 Windows 7点亮你的程序
了解怎样 开发 Windows 7