让WINDOWS的开始按钮也靠边站?搞错没?你一定会问。不过这是真的。
其实在网上搜索一下“开始按钮”几个字,与编程相关的可能多半都是隐藏开始按钮或任务栏什么的,再进一步深入的可能就不好找了。而仅有的那些隐藏开始按钮或任务栏的代码,一旦刷新屏幕,原来已经隐藏了的东西都又冒出来了。
费话就不多说了,很久没写过技术文章了,突然觉得这个东西还比较新颖,好象还没发现有过实现类型功能的软件,就决定把这个功能的实现过程写出来,算是我在开发项目中的一点心得吧。
其实原理很简单,无论是开始按钮还是任务栏,在WINDOWS系统中就一个窗口的概念而已,所以对它们的操作跟普通窗口的操作没什么不一样,这也就意味着,以下的这些文字对高手级别的人物来说就不要看了。而对初学编程或对这篇文字的标题比较感兴趣或好奇的朋友不妨一看,也许你会从中学到点什么也不一定,呵呵。
在读这些文字之前,你需要明白什么是窗口,什么是窗口句柄以及进程空间这些概念,如果这些概念都不太清楚或甚至没看过,那么就请自行查找相关的资料或书籍了。因为这些文字主要还是针对初学编程的朋友,所以我从最开始地一步一步的分析,当然也可能分析得不正确或产生错误,大家就不要见笑了。
要对一个窗口进程操作,那么我们首先要做的第一件事是获得这个窗口的句柄,而获得窗口句柄的方法通常是通过FindWindow和FindWindowEx这两个API函数取得的,这两个函数要求传递窗口的类名、标题和其它的信息,这其中最关键的地方就是窗口的注册类名。这个类名从何得来呢,最简单的方法就是通过SPY++这个工具来获取,怎么获取的详细我就不说了,挺简单的。
前面我们已经说过,无论开始按钮还是任务栏在WINDOWS中就一个窗口的概念,所以要操纵它自然也得先取得它的句柄了。也许你已经知道任务栏的窗口类名为“Shell_TrayWnd”,如果不知道,那就自己使用SPY++来查找了。得到了任务栏的类名过后,接下来就是通过FindWindow函数取得它的窗口句柄了,如下:
HWND hTaskWnd = FindWindow("Shell_TrayWnd", NULL);
后面一个参数为窗口标题,是可选的,直接传NULL。如果函数调用成功,就已经取得任务栏的窗口句柄了。不过通常情况下都能成功的,如果不成功,自己调用GetLastError查看出错原因。
说到这里你可能有疑问了,我们要做的是移动开始按钮的位置啊,干吗说到任务栏上去了。原因很简单,任务栏相当于我们的一个Form窗体,而开始按钮仅是任务栏这个Form的一个按钮,即它的子窗体。我们先获得任务栏的句柄后,再通过这个句柄调用FindWindowEx来获取开始按钮这个子窗体的句柄,如下:
HWND hStartBtnWnd = FindWindowEx(hTaskWnd, NULL, "Button", NULL);
第一个参数为父窗口句柄,即任务栏的句柄,后面的参数不多说了,不明白的自己查。
到现在已经得到开始按钮的窗口句柄了,要移动它的位置还不简单,直接调用MoveWindow函数就可以了,你也许会这样认为。你现在确实已经可以调用MoveWindow函数移动它了,不过我遗憾地告诉你,请你改变任务栏的大小或刷新屏幕。发现什么了?是不是已经移动了的开始按钮又跑回原来的位置了?呵呵,郁闷吧。