一、原理
其原理是利用GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE对打开的窗口进行查找,并将窗口的句柄存放在一个HWND的数组中,结合EnumWindows进行窗口的枚举,从而得到响应的窗口名称;
二、主要函数介绍:
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // callback function
LPARAM lParam // application-defined value
);
LONG GetWindowLong(
HWND hWnd, // handle to window
int nIndex // offset of value to retrieve
);
详细资料请查看MSDN;
在此我定义了一个过程EnumWindowsProc,通过GetWindowLong来完成对打开程序窗口的枚举;通过ListBox实现程序的列举;并将每次调用的枚举结果存放在/info目录下当天日期为文件名称的.txt文件里;
四、主要实现代码:
初始化部分(全局):
HWND hwnd;
HWND m_hwndFind[100] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
int m_num = 0 ;
TCHAR m_store[MAX_PATH];
TCHAR m_name[MAX_PATH];
TCHAR m_strClass[MAX_PATH];
TCHAR m_FilePath[MAX_PATH];
TCHAR m_FileName[24];
枚举处理的代码:
CTime year,day,month,hour,minute,second;
CStdioFile fp;
CTime current = CTime::GetCurrentTime();
year = current.GetYear();
month = current.GetMonth();
day = current.GetDay();
sprintf(m_FileName,"%4d%02d%02d.txt",year,month,day);
::GetModuleFileName(NULL,m_FilePath,MAX_PATH);
(_tcsrchr(m_FilePath,'\\'))[1] = 0;
//sprintf(m_FileName,"info%d.txt",rand());
strcat(m_FilePath,"info\\");
try
{
::CreateDirectory(m_FilePath,NULL);
}
catch(...)
{}
try
{
::SetCurrentDirectory(m_FilePath);
}
catch(...)
{}
strcat(m_FilePath,m_FileName);
if((fp.Open(m_FilePath,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite))==0)
return;
CButton *button = (CButton*)GetDlgItem(IDC_BTN_START);
if(button)
{
button->EnableWindow(FALSE);
}
//enable RESET button
CButton *button2 = (CButton *)GetDlgItem(IDC_BTN_RESET);
if(button2)
{
button2->EnableWindow(TRUE);
}
//enumerate windows by EnumWindowProc function
::EnumWindows(CEmuteWindowsDlg::EnumWindowsProc,NULL);
//add the title of the window in ListBox
for(int i = 0;i <=m_num;i++)
{
HWND m_wnd = m_hwndFind[i];
::GetWindowText(m_wnd,m_store,128);
::GetClassName(m_wnd,m_strClass,MAX_PATH-1);
/* if(!lstrcmpi(m_strClass, _T("Notepad")))
::PostMessage(m_wnd,WM_CLOSE,0,0);*/
HWND hWnd;
UINT nIdFirst;
TCHAR szBuf[MAX_PATH];
hWnd=::GetWindow(m_wnd,GW_CHILD);
if(hWnd == NULL || !::IsWindow(hWnd))
return ;
nIdFirst=::GetDlgCtrlID(hWnd);
do
{
GetClassName(hWnd,szBuf,MAX_PATH);
//etc
hWnd=::GetWindow(hWnd,GW_HWNDNEXT);
if(!::IsWindow(hWnd) || hWnd==NULL)
break;
}while(nIdFirst != ::GetDlgCtrlID(hWnd));
sprintf(m_name,"(%d)标题名称:",i);
strcat(m_name,m_store);
strcat(m_name," 类名称:");
strcat(m_name,m_strClass);
m_strList.AddString(m_name);
fp.SeekToEnd();
fp.WriteString(m_name);
fp.WriteString("\n");
}
fp.SeekToEnd();
fp.WriteString("\n\n");
hour = current.GetHour();
minute=current.GetMinute();
second = current.GetSecond();
sprintf(m_FilePath,"********************%02d时%02d分%02d秒写入***********************",hour,minute,second);
fp.WriteString(m_FilePath);
fp.WriteString("\n\n");
fp.Close();
重新枚举处理:
CButton *button = (CButton *)GetDlgItem(IDC_BTN_START);
if(button)
{
button->EnableWindow(TRUE);
}
//disable RESET button
CButton *button2 = (CButton *)GetDlgItem(IDC_BTN_RESET);
if(button2)
{
button2->EnableWindow(FALSE);
}
m_strList.ResetContent();//reset the ListBox content
m_num = 0;//reset the count
枚举窗口句柄的函数:
在头文件中声明为:
static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
实现部分:
BOOL CEmuteWindowsDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
//be sure the current window is visible
if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE)
{
m_hwndFind[m_num] = hWnd;//record the HWND handle into array
m_num++;//count start
}
return 1;
}
调试环境:
win2000 adv server + vc6.0 + vsp5.0