c#如何获得系统所有窗口名称(包括隐藏窗口)

我还只是个编程新手,在这里想请问大家一个问题,一直困惑我很久了的.我想达到这几个功能效果:1.我想获得系统当前打开的窗口名称(包括隐藏状态的,或者无程序实体但是窗体名称的... 我还只是个编程新手,在这里想请问大家一个问题,一直困惑我很久了的.
我想达到这几个功能效果:
1.我想获得系统当前打开的窗口名称(包括隐藏状态的,或者无程序实体但是窗体名称的)
2.在获得这些窗口名称后,如果更改其属性,让它们显示或隐藏.

举个例子,好比qq2009 sp2(最新版)的一个功能.
我们打开QQ的情况下,在xp进程管理器中 我们只能看到qq一个进程,当我们打开一个聊天窗口中,还只是qq一个进程.
qq新版本有一个锁定功能就是防止用户不在电脑面前的时候别人偷看其隐私
快捷键是"CTRL+ALT+L".当激活后,qq处于锁闭状态.如果有打开的聊天窗口也消失不见.懂点程序的人也猜的到,这可能是qq把聊天窗口给隐藏了.当我们解锁后,窗口又出来了.
为了验证我的想法,我用了一个工具,叫做精锐网吧辅助工具.其中有个功能就是窗口管理.可以查看当前系统所有已打开的窗口,以及所属进程和显示隐藏的更改.经过验证,证实了我的想法.
现在我也想做到这个工具的类似功能. 不知道有哪位高手能指点下.
希望是C#语言的!小弟在这谢谢了!
展开
 我来答
dkxpsg
2009-07-15 · TA获得超过1628个赞
知道小有建树答主
回答量:592
采纳率:0%
帮助的人:1046万
展开全部
获得窗体的句柄可以用GetWindow方法获得窗体标题用GetWindowText方法,显示隐藏某个窗体用ShowWindow方法,给你举个例子

using System.Runtime.InteropServices;

private const int WS_VISIBLE = 268435456;//窗体可见
private const int WS_MINIMIZEBOX = 131072;//有最小化按钮
private const int WS_MAXIMIZEBOX = 65536;//有最大化按钮
private const int WS_BORDER = 8388608;//窗体有边框
private const int GWL_STYLE = (-16);//窗体样式
private const int GW_HWNDFIRST = 0;
private const int GW_HWNDNEXT = 2;
private const int SW_HIDE = 0;
private const int SW_SHOW = 5;

[DllImport("User32.dll")]
private extern static int GetWindow(int hWnd, int wCmd);
[DllImport("User32.dll")]
private extern static int GetWindowLongA(int hWnd, int wIndx);
[DllImport("user32.dll")]
private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private extern static int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern int ShowWindow(int hwnd, int nCmdShow);

//获得包含窗体可见、有边框、有最大化按钮的窗体的句柄和标题(窗体的属性出这几种外还有很多种)
public static List<FromInfo> GetHandleList(int Handle)
{
List<FromInfo> fromInfo = new List<FromInfo>();
int handle = GetWindow(Handle, GW_HWNDFIRST);
while (handle > 0)
{
int IsTask = WS_VISIBLE | WS_BORDER | WS_MAXIMIZEBOX;//窗体可见、有边框、有最大化按钮
int lngStyle = GetWindowLongA(handle, GWL_STYLE);
bool TaskWindow = ((lngStyle & IsTask) == IsTask);
if (TaskWindow)
{
int length = GetWindowTextLength(new IntPtr(handle));
StringBuilder stringBuilder = new StringBuilder(2 * length + 1);
GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
string strTitle = stringBuilder.ToString();
if (!string.IsNullOrEmpty(strTitle))
{
fromInfo.Add(new FromInfo(strTitle, handle));
}
else
{
fromInfo.Add(new FromInfo("", handle));
}
}
handle = GetWindow(handle, GW_HWNDNEXT);
}
return fromInfo;
}
//获得所有窗体的句柄和标题
public static List<FromInfo> GetHandleList(int Handle)
{
List<FromInfo> fromInfo = new List<FromInfo>();
int handle = GetWindow(Handle, GW_HWNDFIRST);
while (handle > 0)
{
int length = GetWindowTextLength(new IntPtr(handle));
StringBuilder stringBuilder = new StringBuilder(2 * length + 1);
GetWindowText(handle, stringBuilder, stringBuilder.Capacity);
string strTitle = stringBuilder.ToString();
if (!string.IsNullOrEmpty(strTitle))
{
fromInfo.Add(new FromInfo(strTitle, handle));
}
else
{
fromInfo.Add(new FromInfo("", handle));
}
handle = GetWindow(handle, GW_HWNDNEXT);
}
return fromInfo;
}

public class FromInfo
{
public FromInfo(string title, int handle)
{
this.title = title;
this.handle = handle;
}
private string title;
private int handle;

public string Title
{
get { return title; }
set { title = value; }
}
public int Handle
{
get { return handle; }
set { handle = value; }
}
}

//获得窗体句柄和标题
private void button1_Click(object sender, EventArgs e)
{
List<FromInfo> fromInfo = GetHandleList(this.Handle.ToInt32());
}
private void button2_Click(object sender, EventArgs e)
{
//隐藏窗体
ShowWindow(this.Handle.ToInt32(), SW_HIDE);
//显示窗体
ShowWindow(this.Handle.ToInt32(), SW_SHOW);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友94f02eb
2009-07-14 · TA获得超过8612个赞
知道大有可为答主
回答量:7955
采纳率:74%
帮助的人:4477万
展开全部
这个,是可以实现的,使用Windows 的 API EnumDesktopWindows 可以实现
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式