有没有EnumChildWindows的例子啊
有没有EnumChildWindows的例子啊
得到了一个窗体的句柄,怎么才能看这个窗体的类名?
问题点数:0、回复次数:11Top
1 楼GameWeaverDummy(小白菜)回复于 2004-05-01 23:42:02 得分 0
upTop
2 楼nik_Amis(...)回复于 2004-05-01 23:50:15 得分 0
upTop
3 楼sgnaw(李逍遥)回复于 2004-05-02 00:07:16 得分 0
例如,窗口上有一个 IDC_LIST1 的 Lixt Box ,那么 EnumWindowsProc 和 OK 按钮的代码如下:
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
CListBox * list=(CListBox *)lParam;
char buf[256];
CString sstt;
GetWindowText(hwnd,buf,256);
if(strlen(buf))
{
// 插入所有窗口名称
int idx=list->AddString(buf);
sstt = buf;
// 过滤得到想要的
if(sstt.Compare("你的窗口名称") == 0)
{
// do something...
}
}
return TRUE;
}
void CListDlg::OnOK()
{
CListBox * list=(CListBox *)GetDlgItem(IDC_LIST1);
list->ResetContent();
FARPROC EnumProcInstance=MakeProcInstance(
(FARPROC)EnumWindowsProc,AfxGetInstanceHandle());
EnumWindows((WNDENUMPROC)EnumProcInstance,(LPARAM)list);
FreeProcInstance(EnumProcInstance);
UpdateData();
}Top
4 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2004-05-02 00:43:13 得分 0
http://tech.99soft.net/h/2002-8-5/103857.htm
.窗口及子窗口枚举
UINT ThreadProc(LPVOID *pPraram)
{
while(1){ while(!EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL))break;}
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
char lpWinTitle[MAX_LINELENGTH];
::GetWindowText(hwnd,lpWinTitle,MAX_LINELENGTH-1);
if(strcmp(lpWinTitle,sTitle)==0)// sTitle:网络登录窗口的窗口名
{ gMutex.Lock(INFINITE);//防止两个线程同时操作
while(EnumChildWindows(hwnd,(WNDENUMPROC)EnumChildProc,NULL));
gMutex.Unlock();
return FALSE;
}
return TRUE;
}
BOOL CALLBACK EnumChildProc( HWND hwnd,LPARAM lParam)
{
char sChildName[MAX_LINELENGTH];
::GetClassName(hwnd,sChildName,MAX_LINELENGTH-1);
file://处理编辑控件,登录窗口中一般只有两个编辑框,可用MicroSoft Spy++查看窗口的
file://各个子窗口
// 的属性。通过对比各控件的风格或名字来区别各控件。
if(strcmp(sChildName,"Edit")==0)
{
DWORD dWinSty=::GetWindowLong(hwnd,GWL_STYLE);
if((dWinSty&ES_PASSWORD)==ES_PASSWORD)//这是密码输入编辑控件
{
gEventNextPass.SetEvent();//发送“新密码”事件
WaitForSingleObject(gEventPassOk, INFINITE); file://等待“密码完成”事件
gEventPassOk.ResetEvent(); file://复位
::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);
file://把新密码填到密码输入框,也可用SetWindowText()
bPass=TRUE;//记录密码已填入
if(bUser&&(hOk!=NULL))//如果用户名已填入,“确定”按钮已找到。
{
::SendMessage(::GetParent(hOk),WM_COMMAND,
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
file://向“确定”按钮送消息,参照ClassWizard的消息映射
bUser=FALSE;bPass=FALSE;hOk=NULL;
file://完成一次登录,初始化
return FALSE;
}
return TRUE;
}
file://非此即彼,这是用户名输入编辑控件
if((dWinSty&ES_READONLY)!=ES_READONLY)
{
::SetDlgItemText(::GetWindowLong(hwnd,GWL_ID),cCurrentPass);
file://把新用户名填到用户名输入框,也可用SetWindowText()
bUser=TRUE;// 新用户名已填入用户名输入框
if(bPass&&(hOk!=NULL)) 如果密码已填入,“确定”按钮已找到。
{
::SendMessage(::GetParent(hOk),WM_COMMAND,
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
file://向“确定”按钮送消息,参照ClassWizard的消息映射
bUser=FALSE;bPass=FALSE;hOk=NULL;
file://完成一次登录,初始化
return FALSE;
}
}
return TRUE;
}
file://如果是按钮控件
if(strcmp(sChildName,"Button")==0)
{
char sChildTitle[MAX_LINELENGTH];
::GetWindowText(hwnd,sChildTitle,MAX_LINELENGTH-1);
if(strcmp(sChildTitle,sButtonOk)!=0) return TRUE;
// sButtonOk:登录窗口中“OK”按钮的标题
hOk=hwnd;//记录“OK”窗口句柄
if(bUser&&bPass)
{
::SendMessage(::GetParent(hOk),WM_COMMAND,
(WPARAM)::GetWindowLong(hOk,GWL_ID),(LPARAM)(hOk));
file://向“确定”按钮送消息,参照ClassWizard的消息映射
bUser=FALSE;bPass=FALSE;hOk=NULL;
file://完成一次登录,初始化
return FALSE;
}
return TRUE;
}
return TRUE;
}Top
5 楼yujia120(永不停息)回复于 2004-05-02 01:42:52 得分 0
http://www.freevbcode.com/source/inifiletotreeview.zipTop
6 楼yujia120(永不停息)回复于 2004-05-02 01:44:44 得分 0
http://www.yesky.com/SoftChannel/72342371928702976/20040322/1779597_1.shtmlTop
7 楼kuangjingbo(正在学习windows)回复于 2004-05-02 16:10:09 得分 0
GetWindowLongTop
8 楼swordbroken(断剑书生)回复于 2004-05-02 16:20:41 得分 0
Try to learn everything from MSDN by yourself, then you'll be a expert.Top
9 楼c4313848(从自己做起,让抵制日货成为一种时尚,成为一种潮流)回复于 2004-08-13 16:35:42 得分 0
upTop
10 楼bager(柏哥)回复于 2004-08-13 17:25:24 得分 0
按Win+R快捷键启动“运行”程序(仅做示范),调用下述Test函数,将依次枚举其子窗体。
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam)
{
TCHAR szWndTitle[1024];
int nLen = GetWindowText(hwndChild, szWndTitle, 1024);
if (nLen)
{
AfxMessageBox(szWndTitle);
CString strCancel("取消");
if (strCancel.CollateNoCase(szWndTitle) ==0)
{
return FALSE;//终止枚举。
}
}
return TRUE;
}
void Test()
{
CString strWindowName ="运行";
HWND hNMMainWnd= FindWindowEx(NULL,NULL,NULL,strWindowName);
if (IsWindow(hNMMainWnd))
{
EnumChildWindows(hNMMainWnd,EnumChildProc,NULL);
}
}Top
11 楼riguiluo(落日归)回复于 2004-08-14 09:51:39 得分 0
dialog里面实现
#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_STYLE))
BOOL CALLBACK EnumChildProc( HWND hwnd,LPARAM lParam )
{
char classname[200];
CMyDlg *dlg = (CMyDlg *)lParam;
DWORD style;
GetClassName( hwnd, classname, 200 );
style = GetWindowStyle( hwnd );
if ( strcmp( classname, "Button" ) == 0 )
{
style = (UINT)GetWindowLong(hwnd, GWL_STYLE) & 0xff;
if ( style == BS_PUSHBUTTON || style == BS_DEFPUSHBUTTON )
........
}
else if...........
return TRUE;
}
Top




