原创 VC6.0实现窗口查找

2011-10-28 17:25 3269 25 25 分类: MCU/ 嵌入式
    这几天一直在使用VC6.0编写程序,遇到了一个问题,折腾了一天多才得到解决,现在就来分享一下:
    当时的情形是这样的,我计划点击主对话框1的按键“开始”调出对话框2,对话框2上有PROGRESS控件,用于显示目前工作进行的进度。同时主程序进行压缩文件和传输文件的工作。当然,毫无疑问,在主对话框的CPP代码中,我们要开辟一个新的线程来完成压缩和传输工作,线程开辟要在对话框调用之前:
    hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID);  //调用子进程
    CProgressDlg dlg;
    dlg.DoModal();
    ThreadFunc里包含压缩和传输文件代码。当ThreadFunc执行完第一步工作后,它需要向对话框2发送消息,告诉2目前的进度,2会根据收到的消息的参数改变PROGRESS控件的位置。为了能够找到对话框2,我们最初调用::FindWindow(0,“文件传输”)来查找对话框2,“文件传输”是对话框2的标题。然后使用::SendMessage(prog_hwnd,UM_PROGRESS,5,0);发消息给对话框2,prog_hwnd是对话框2窗口句柄,UM_PROGRESS是我们子定义消息。对话框2接收到消息UM_PROGRESS后会进行处理。这样看似乎很漂亮地解决了问题,但是。。。
   如果我们打开两个该程序的进程,点击进程A主对话框1的按键“开始”,在进程A进行压缩和传输工作时,点击了进程B主对话框1的按键“开始”,那么当B的ThreadFunc调用::FindWindow(0,“文件传输”)来查找对话框2时,我们找到的却是进程A对话框2的句柄。对于进程A和B它们的对话框2的标题都是“文件传输”,出现这样的问题也不奇怪了。这里我们采用while(EnumWindows((WNDENUMPROC)EnumWindowsProcFileTrans, 0))来解决这一问题。
EnumWindowsProcFileTrans()是回调函数,EnumWindows枚举目前所有的窗口句柄,将它传递给EnumWindowsProcFileTrans。我们为EnumWindowsProcFileTrans编写如下内容:
BOOL CALLBACK EnumWindowsProcFileTrans(HWND hwnd, DWORD lParam) 
{
CWinThread *hThread=::AfxGetThread();
DWORD tID;
char str[50];
CString tag;
::GetWindowText(hwnd,str,50);
tag.Format("%s",str);
    if(tag=="文件传输")
{
tID=::GetWindowThreadProcessId(hwnd,NULL);
if(tID==hThread->m_nThreadID)
{
prog_hwnd=hwnd;           //找到窗口句柄
   return false;
}
else
return true;
}
return true;
}
    基本原理是通过句柄获取窗口的标题,与 "文件传输"比较,如果窗口标题是"文件传输",那么我们获取该句柄的线程ID和我们本身主线程ID比较,查看是否匹配。

文章评论0条评论)

登录后参与讨论
我要评论
0
25
关闭 站长推荐上一条 /2 下一条