我的思想:当前运行程序的句柄是以DESKTOPWND为根的一棵树,只要遍历些树
就可得到所有窗口句柄。::GetWindow用GW_CHILD是下一层,而GW_NEXT是同层。
以下是程序,仅供参考。struct MYHWND{
HWND hwnd;
CString caption;
CString classname;
};void CCommand::hwndGetAll()
{
MYHWND myhwnd;
HWND temphwnd; hwndDeskTop = ::GetDesktopWindow();
temphwnd = ::GetWindow(hwndDeskTop, GW_CHILD); do{
//Get Wnd Handle
myhwnd.hwnd = temphwnd;
//Get Wnd Class Name
if(!::GetClassName(temphwnd, myhwnd.classname.GetBuffer(100), 100))
myhwnd.classname.Empty();
myhwnd.classname.ReleaseBuffer();
//Find Sys Tab Control
if(myhwnd.classname == "Shell_TrayWnd")
{
HWND temp = ::GetWindow(temphwnd, GW_CHILD);
CString name;
while(temp)
{
::GetClassName(temp, name.GetBuffer(100), 100);
name.ReleaseBuffer();
if(name == "Button")
hwndStart = temp;
else if(name == "MSTaskSwWClass")
{
HWND temp2 = ::GetWindow(temp, GW_CHILD);
CString name2;
while(temp2)
{
::GetClassName(temp2, name2.GetBuffer(100), 100);
name2.ReleaseBuffer();
if(name2 == "SysTabControl32")
{
hwndSysTab = temp2;
break;
}
temp2 = ::GetWindow(temp2, GW_HWNDNEXT);
}
}
temp = ::GetWindow(temp, GW_HWNDNEXT);
}
}
//Find Sys List View Control
if(myhwnd.classname == "Progman")
{
HWND temp = ::GetWindow(temphwnd, GW_CHILD);
CString name;
while(temp)
{
::GetClassName(temp, name.GetBuffer(100), 100);
name.ReleaseBuffer();
if(name == "SHELLDLL_DefView") break;
temp = ::GetWindow(temp, GW_HWNDNEXT);
}
if(name == "SHELLDLL_DefView")
{
HWND temp2 = ::GetWindow(temp, GW_CHILD);
CString name2;
while(temp2)
{
::GetClassName(temp2, name2.GetBuffer(100), 100);
name2.ReleaseBuffer();
if(name2 == "SysListView32")
{
hwndSysListView = temp2;
break;
}
temp2 = ::GetWindow(temp2, GW_HWNDNEXT);
}
}
}
//Get Wnd Title
if(!::GetWindowText(temphwnd, myhwnd.caption.GetBuffer(100), 100))
myhwnd.caption.Empty();
myhwnd.caption.ReleaseBuffer();
//Add It To Array
hwndArray.Add(myhwnd); temphwnd = ::GetWindow(temphwnd, GW_HWNDNEXT);
}while(temphwnd);
}
就可得到所有窗口句柄。::GetWindow用GW_CHILD是下一层,而GW_NEXT是同层。
以下是程序,仅供参考。struct MYHWND{
HWND hwnd;
CString caption;
CString classname;
};void CCommand::hwndGetAll()
{
MYHWND myhwnd;
HWND temphwnd; hwndDeskTop = ::GetDesktopWindow();
temphwnd = ::GetWindow(hwndDeskTop, GW_CHILD); do{
//Get Wnd Handle
myhwnd.hwnd = temphwnd;
//Get Wnd Class Name
if(!::GetClassName(temphwnd, myhwnd.classname.GetBuffer(100), 100))
myhwnd.classname.Empty();
myhwnd.classname.ReleaseBuffer();
//Find Sys Tab Control
if(myhwnd.classname == "Shell_TrayWnd")
{
HWND temp = ::GetWindow(temphwnd, GW_CHILD);
CString name;
while(temp)
{
::GetClassName(temp, name.GetBuffer(100), 100);
name.ReleaseBuffer();
if(name == "Button")
hwndStart = temp;
else if(name == "MSTaskSwWClass")
{
HWND temp2 = ::GetWindow(temp, GW_CHILD);
CString name2;
while(temp2)
{
::GetClassName(temp2, name2.GetBuffer(100), 100);
name2.ReleaseBuffer();
if(name2 == "SysTabControl32")
{
hwndSysTab = temp2;
break;
}
temp2 = ::GetWindow(temp2, GW_HWNDNEXT);
}
}
temp = ::GetWindow(temp, GW_HWNDNEXT);
}
}
//Find Sys List View Control
if(myhwnd.classname == "Progman")
{
HWND temp = ::GetWindow(temphwnd, GW_CHILD);
CString name;
while(temp)
{
::GetClassName(temp, name.GetBuffer(100), 100);
name.ReleaseBuffer();
if(name == "SHELLDLL_DefView") break;
temp = ::GetWindow(temp, GW_HWNDNEXT);
}
if(name == "SHELLDLL_DefView")
{
HWND temp2 = ::GetWindow(temp, GW_CHILD);
CString name2;
while(temp2)
{
::GetClassName(temp2, name2.GetBuffer(100), 100);
name2.ReleaseBuffer();
if(name2 == "SysListView32")
{
hwndSysListView = temp2;
break;
}
temp2 = ::GetWindow(temp2, GW_HWNDNEXT);
}
}
}
//Get Wnd Title
if(!::GetWindowText(temphwnd, myhwnd.caption.GetBuffer(100), 100))
myhwnd.caption.Empty();
myhwnd.caption.ReleaseBuffer();
//Add It To Array
hwndArray.Add(myhwnd); temphwnd = ::GetWindow(temphwnd, GW_HWNDNEXT);
}while(temphwnd);
}
解决方案 »
- WIN7普通账户下ATL做的控件在网页上出不来
- 利用winpcap可否实现控制本机别的exe上网流量?
- 用_wtoi函数 CString转int问题
- C++Builder中编的C++类,头文件中有些宏,能在Microsoft Visual Studio.Net(VS2005/2008)中用吗
- 怎样添加鼠标移出消息?
- 如何把LIB函数导入工程?
- 我写的这画坐标的类,在大量反复交叉调用的时候boundschecker检查出了内存泄漏,(少数次调用的时候不会出现泄漏)请各位高手指教泄漏的
- o(︶︿︶)o 唉 有难题- -win32 API高手进,,,
- 100分,求教简单的局域网语音通讯源码!
- 关于报表打印的问题
- 怎样在IE中加入自己的菜单按钮,想金山词霸那样????
- 十万火急!!希望有高手能够解决!!日后一定送上高分!!!!
HWND = ::FindWindow(_T("Notepad"),NULL);
if(IsWindow(HWND))
{
...
}
窗口类名可以自定义,在虚拟函数PreCreateWindow()函数里面注册。
外部程序可以用SPY++查找类名。
代码如下:
HWND pWnd;
pWnd=::GetDesktopWindow();//得到第一个窗口句柄
pWnd=::GetNextWindow(pWnd,GW_HWNDNEXT);//得到下一个窗口句柄
你的方法我也试过了,得到了很多句柄不是任务栏中的程序,能不能把这些不是任务栏中的程序过滤掉?