枚举桌面窗口的方法

枚举桌面窗口的方法

1楼 bugn


EnumWindows



2楼 Tice


BOOL EnumWindows(

WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
);



3楼 Tice



BOOL CALLBACK EnumWindowsProc(

HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
);



4楼 ZencengLiu


Maybe :
#include "tlhelp32.h"

DWORD ProcID[256];
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HINSTANCE handle = (HINSTANCE)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(handle)
{
if(Process32First(handle,&pe32))
{
do
{
LPSTR pCurChar = pe32.szExeFile ;
ProcID[n] = pe32.th32ProcessID;
printf("%d/t%s/n",n,pCurChar);
++n;
}
while(Process32Next(handle,&pe32));
}

CloseHandle(handle);



5楼 ZencengLiu


这好像是列举进程的 !



6楼 yarao


BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam );

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
两个函数
其中用EnumWindows来枚举窗口,lpEnumFunc 是指向第二(CallBack)函数的函数指针
当你调用EnumWindows後它就开始枚举窗口,每当枚举到一个窗口它就调用EnumWindowsProc
你可以在EnumWindowsProc中写入你对EnumWindowsProc的处理动作!
列子 在对话框中枚举每一个主(注意:对子窗口还要用其他的函数)窗口并把
窗口的Caption加入到对话框的列表框中:
对话框中有一个列表框 其ID为 IDC_LIST1
一个按钮
在对话框的枚举窗口按钮的WM_LBOUTTONDOWN消息中写下
EnumWindows(EnumWindowsProc,(LPARAM)hwnd);
其中EnumWindowsProc 为回调函数地址。hwnd为对话框窗口的句柄
而EnumWindowsProc的实现如下
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)/*枚举窗口过程*/
{
CHAR szCaption[500];
HWND hdlg; /*对话框的句柄*/
long llen;
hdlg = (HWND)lParam;
llen = SendMessage(hwnd,WM_GETTEXTLENGTH,0,0)+1;/*得到窗口的Caption的
长度*/
if((llen>1)&&(llen<500))
{
GetWindowText(hwnd,szCaption,sizeof(szCaption));/*取得窗口的Caption
并存放在szCaption中*/
SendDlgItemMessage(hdlg,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)szCaption);
/*把窗口的Caption加到对话框中*/
}
return true;
}

以上程序 只能列出主窗口!无法列出主窗口的子窗口哦!





7楼 yarao


改正 /*把窗口的Caption加到对话框中*/ 为 /*把窗口的Caption加到对话框的列表框中*/



8楼 Tice


用FindWindow()就可以列主窗口



9楼 Tice


对不起,打错了用FindWindow()就可以列子窗口



10楼 gameboy999


我知道至少有三种方法可以枚举所有窗体,当然子窗体也可以同理来枚举了。
1。用getwindow 直接获取从0到65535的所有窗体,如果返回值不为0则存在该窗体。
不过好象这种方法有问题@@
2.用getwindow 的参数,先取得最前面的,然后不断取得他的next,直到没有窗体得到
听说容易造成死机:0
3.EnumWindows才是最好的选择,不但可以枚举普通窗体,也可以枚举子窗体,不过在使用上也最麻烦。
有兴趣的话可以看看我的程序 论坛 共享软件 网络辅助中的 i-Fresher,里面有枚举所有窗体及其子窗体的功能,我可以提供原代码,不过是delphi写的。



11楼 yarao


BOOL EnumChildWindows(
HWND hWndParent, // handle to parent window
WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
);

BOOL EnumChildWindows(
HWND hWndParent, // handle to parent window
WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
)
是用来枚举子窗口的