[.NET] 打造防“狼”神器 :任务栏篇

@微微一笑:本文标题纯属自娱自乐。

隐藏任务栏效果图:

对比

说起来惭愧,上面这个隐藏任务栏功能,只是完成了我一半的预想。本想是可以选择性的隐藏任务栏上的某个TaskBarButton,但是Win7+后的任务栏变化之大,令我到现在还没有完全搞清楚选择性隐藏功能的实现思路。也希望博友们给我点思路,为人类做一点贡献,又说远了。

先说一说Win7+ 与 XP- 任务栏的不同 (通过Spy++查看):

Win7:

XP:

从上面两图可以看出,Win7+ 所有的TaskBarButton 是在MSTaskListWClass的窗口上,而 XP 是在ToolbarWindow32 的窗口上。并且以前在XP上能使用的Windows自定义消息(比如:TB_BUTTONCOUNT),在Win7上完全没有用。所以为了实现本文的隐藏任务栏的效果,就要判断下操作系统的版本了。下面以Win8为例子,说一下用到了哪些WinAPI函数。

1         [DllImport("user32.dll", EntryPoint = "FindWindow")]
2         private extern static IntPtr FindWindow(string lpClass, string lpWindowName);
3 
4         [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
5         private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClass, string lpWindowName);
6 
7         [DllImport("User32.dll", EntryPoint = "ShowWindow")]
8         private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

这些API函数大家也都很熟悉了,不懂的童靴也可以GG或者来问问我。

主要的实现思路:

按照Spy++所显示的层次结构,一步一步的往下获得MSTaskListWClass窗口的句柄(利用FindWindow 与 FindWindowEx),再利用ShowWindow控制MSTaskListWClass窗口的显示与隐藏。代码如下:

 1        IntPtr _Ptr = FindWindow("Shell_TrayWnd",null);
 2             if (_Ptr == IntPtr.Zero)
 3                 return;
 4             IntPtr _ChildHWnd = FindWindowEx(_Ptr, IntPtr.Zero, "ReBarWindow32", null);
 5             if (_ChildHWnd == IntPtr.Zero)
 6                 return;
 7             IntPtr _MSTaskHwnd = FindWindowEx(_ChildHWnd, IntPtr.Zero, "MSTaskSwWClass", null);
 8             if (_MSTaskHwnd == IntPtr.Zero)
 9                 return;
10             IntPtr _MSTaskListHwnd = FindWindowEx(_MSTaskHwnd, IntPtr.Zero, "MSTaskListWClass", null);
11             if (_MSTaskListHwnd == IntPtr.Zero)
12                 return;
13             //Show
14             ShowWindow(_MSTaskListHwnd, 5);
15             //Hide
16             ShowWindow(_MSTaskListHwnd, 0);

代码是比较简单,本文所有的隐藏效果是达到了,但是我的想法还没有实现,我会继续探索下去 --- TaskBarButton的选择性隐藏。

关于任务栏操作的一些讨论:

http://social.msdn.microsoft.com/Forums/en-US/8e1e504e-fa91-426a-97b8-f5640f64ad93/windows-7-taskbar-the-undocumented-mstasklistwclass-

http://blog.strixcode.com/2011/01/how-to-find-taskbar-button-position-on.html

posted @ 2013-12-12 11:12  @Sunth  阅读(1333)  评论(0编辑  收藏  举报