★远处的灯火 发表于 2015-1-25 13:25:33

如何通过类名找到一个窗口的句柄?

问题1:如何枚举当前所有窗口的进程ID,标题,句柄,类名?
问题2:桌面现在有很多窗口,其中有两个窗口,暂且叫做窗口A,窗口B;他们的类名都是"HELLO",其中窗口A的标题是“我是窗口A”,窗口将B的标题未知,那么如何找到窗口B的句柄呢?可以的话麻烦热心的鱼油写一下详细的代码。
{:7_123:}


lixiaoshuai 发表于 2015-2-7 17:44:27

BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{//枚举子窗口的回调函数
setlocale(LC_ALL,"chs");
count++;
TCHAR lpWinTitle,lpClassName;
::GetWindowTextW(hwnd,(LPWSTR)lpWinTitle,256-1); //获得窗口caption
::GetClassNameW(hwnd,(LPWSTR)lpClassName,256-1); //获得窗口类名
if (wcsicmp((LPWSTR)lpWinTitle,L"")!=NULL && wcsicmp((LPWSTR)lpClassName,L"")!=NULL) //过滤掉没有名子和类名的窗口
{
fwprintf(fp,_T("\n"));
for (int i=1;i<=count;i++) fprintf(fp," ");
fwprintf(fp,_T("-0xX:'%ws':'%ws'"),hwnd,lpWinTitle,lpClassName);
if(wcsicmp(lpClassName,L"SysListView32")==NULL)
   ShowListView(hwnd);

EnumChildWindows(hwnd,EnumChildProc,0); //递归枚举子窗口
}
count--;
return TRUE ;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)
{//枚举窗口的回调函数
setlocale(LC_ALL,"chs");
count = 1;
TCHAR lpWinTitle,lpClassName;
::GetWindowTextW(hwnd,lpWinTitle,256-1); //获得窗口caption
::GetClassNameW(hwnd,lpClassName,256-1); //获得窗口类名
if (wcsicmp(lpWinTitle,L"")!=NULL && wcsicmp(lpClassName,L"")!=NULL) //过滤掉没有名子和类名的窗口
{
fwprintf(fp,_T("\n*-0xX:'%ws':'%ws'"),hwnd,lpWinTitle,lpClassName);

EnumChildWindows(hwnd,EnumChildProc,0); //继续枚举子窗口,传递给回调函数该子窗口的句柄
}
return TRUE ;
}
int main()
{
setlocale(LC_ALL,"chs");
::EnumWindows(EnumWindowsProc,0); //枚举桌面的窗口,每找到一个窗口,调用一次回调函数,传递给回调函数该窗口的句柄
system("pause");
return 0;
}

freeparty 发表于 2015-2-7 22:23:50

FindWindow,http://baike.baidu.com/link?url=aBqhueV99b-El0tIiyf5wN6ThWzxwOWrrATuMHFu0CC16Mu3u3UTRFAP5KjUOqdKOTbNFLQn0MmavRug3KIL6a,别想的那么难。
页: [1]
查看完整版本: 如何通过类名找到一个窗口的句柄?