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

时间:2021-11-28 03:33:43

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

隐藏任务栏效果图:

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

对比

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

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

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

Win7:

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

XP:

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

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

         [DllImport("user32.dll", EntryPoint = "FindWindow")]
private extern static IntPtr FindWindow(string lpClass, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
private extern static IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClass, string lpWindowName); [DllImport("User32.dll", EntryPoint = "ShowWindow")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

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

主要的实现思路:

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

        IntPtr _Ptr = FindWindow("Shell_TrayWnd",null);
if (_Ptr == IntPtr.Zero)
return;
IntPtr _ChildHWnd = FindWindowEx(_Ptr, IntPtr.Zero, "ReBarWindow32", null);
if (_ChildHWnd == IntPtr.Zero)
return;
IntPtr _MSTaskHwnd = FindWindowEx(_ChildHWnd, IntPtr.Zero, "MSTaskSwWClass", null);
if (_MSTaskHwnd == IntPtr.Zero)
return;
IntPtr _MSTaskListHwnd = FindWindowEx(_MSTaskHwnd, IntPtr.Zero, "MSTaskListWClass", null);
if (_MSTaskListHwnd == IntPtr.Zero)
return;
//Show
ShowWindow(_MSTaskListHwnd, );
//Hide
ShowWindow(_MSTaskListHwnd, );

代码是比较简单,本文所有的隐藏效果是达到了,但是我的想法还没有实现,我会继续探索下去 --- 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