自由安排你的N个窗口
对于这些经常泡网、载东东、写程序的人来说,通常要开N多个窗口,有些时候为了比较两个窗口、观察效果经常要在两个窗口上来回切换,很是不便,特别是屏幕小的更是麻烦!下面这个程序是专门用来设置任意窗体处于最顶端的,通过拖动十字光标到所要的窗口,就可以得到该窗口的句柄并自动设为最顶层,也可以通过右键来删除不要的窗口:
下面就来分析代码:
要设置窗口在Windows Z轴的位置可以调用WinAPI:SetWindowPos:
in VB6.0
in C#:
public static extern long SetWindowPos(IntPtr hwnd, int hInsertAfter, int x, int y, int cx, int cy, int nFlag);
[DllImport("user32.dll", EntryPoint = "SetWindowPos", CharSet = CharSet.Auto)]
public static extern long SetWindowPos(IntPtr hwnd, IntPtr hInsertAfter, int x, int y, int cx, int cy, int nFlag);
下面表格是对参数的说明:
参数 |
说明 |
||
in VB6.0 |
in C# |
|
|
HWND hWnd |
IntPtr hwnd |
要移动的窗口的句柄 |
|
HWND hInsertAfter |
HWND_BOTTOM(1) |
IntPtr hwnd int |
把窗口放在Z轴的最后,即所有窗口的后面 |
HWND_TOP(0) |
IntPtr hwnd int |
将窗口放在Z轴的顶部,即所有窗口的前面 |
|
HWND_TOPMOST(-1) |
IntPtr hwnd int |
使窗口成为“TopMost”类型的窗口,这种类型的窗口总是在其它窗口的前面,直到它被关闭 |
|
HWND_NOTOPMOST(-2) |
IntPtr hwnd int |
将窗口放在所有“TopMost”类型 |
|
int x |
int x |
以客户坐标指定窗口新位置的左边界 |
|
int y |
int y |
以客户坐标指定窗口新位置的顶边界 |
|
int cx |
int cx |
以像素指定窗口的新的宽度 |
|
int cy |
int cy |
以像素指定窗口的新的高度 |
|
UINT nFlag |
SWP_ASNCWINDOWPOS |
int |
如果调用进程不拥有窗口,系统会向拥有窗口的线程发出需求。这就防止调用线程在其他线程处理需求的时候发生死锁 |
SWP_DEFERERASE |
int |
防止产生WM_SYNCPAINT消息 |
|
… |
|
好多啊,有兴趣的可以查一查《Windows API大全》或者:MSDN |
要获得第一个参数(句柄,C#里为IntPtr类型)可以使用WindowFromPoint(POINT Point)方法,该方法在C#的定义为:
public static extern IntPtr WindowFromPoint(POINT Point);
这里有一个POINT结构体的参数,用来传递鼠标坐标:
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
this.X = x;
this.Y = y;
}
public static implicit operator System.Drawing.Point(POINT p)
{
return new System.Drawing.Point(p.X, p.Y);
}
public static implicit operator POINT(System.Drawing.Point p)
{
return new POINT(p.X, p.Y);
}
这样,我们就可以获取任意坐标、任意object的句柄了,有了该句柄剩下的就是查一下Windows API看看使用该句柄能完成哪些任务了。
最近在想有没有这样的一个程序在你关机前能够有选择地保存一些应用程序的状态,等到下次开机的时候又把这些程序还原到上次的状态,就像Firefox里的标签保存功能。或许使用Windows API也可以完成这些任务,有时间的话再找找看。
最后,把压缩包链接上来,对该程序有意见的不要忘记ps我哦~~