您的位置:首页 > 其它

枚举当前打开的所有窗口

2004-06-02 09:59 281 查看
一、原理
其原理是利用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: