- 获取应用程序:
- #pragma once
- #include "afxcmn.h"
- /*判断窗口是否是正常运行还是未响应的*/
- typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW)( HWND );
- typedef BOOL (WINAPI *PROCISHUNGTHREAD)( DWORD );
- // CEnumWindowsDlg 对话框
- class CEnumWindowsDlg : public CDialog
- {
- DECLARE_DYNAMIC(CEnumWindowsDlg)
- public :
- CEnumWindowsDlg(CWnd* pParent = NULL); // 标准构造函数
- virtual ~CEnumWindowsDlg();
- // 对话框数据
- enum { IDD = IDD_ENUMWINDOWS_DIALOG };
- protected :
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
- DECLARE_MESSAGE_MAP()
- public :
- afx_msg void OnDestroy();
- /*刷新CListCtrl上的任务*/
- afx_msg void OnBnClickedButtonRefrush();
- virtual BOOL OnInitDialog();
- public :
- CListCtrl m_ListWnds;
- CImageList m_ImgList;
- PROCISHUNGAPPWINDOW m_pIsHungAppWindow;
- PROCISHUNGTHREAD m_pIsHungThread;
- /* 判断当前操作系统是否是Windows NT/2000以上
- 不同的操作系统,判断程序是否运行正常的方式是不一样的*/
- BOOL m_bIsNT;
- bool m_bLoadIcon; //是否加载icon
- private :
- BOOL GetOSVersion();
- BOOL static CALLBACK enumProc( HWND hwnd, LPARAM lParam);
- HICON static GetWindowsIcon( HWND hwnd);
- BOOL bWindowsRun( HWND hwnd); //是否在运行
- void CloseHwnd( HWND hwnd);
- BOOL static CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam );
- DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout );
- void InsertListItem( HWND hwnd,CString strName);
- void SaveIcon( HICON hIconToSave, LPCTSTR sIconFileName);
- };
- // EnumWindowsDlg.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "VNCServerTestMFC.h"
- #include "EnumWindowsDlg.h"
- /*定义关闭窗口返回值*/
- #define TA_FAILED (0x0L)
- #define TA_SUCCESS_KILL (0x2L)
- #define TA_SUCCESS_CLEAN (0x1L)
- // CEnumWindowsDlg 对话框
- IMPLEMENT_DYNAMIC(CEnumWindowsDlg, CDialog)
- CEnumWindowsDlg::CEnumWindowsDlg(CWnd* pParent /*=NULL*/ )
- : CDialog(CEnumWindowsDlg::IDD, pParent)
- ,m_bLoadIcon( true )
- {
- }
- CEnumWindowsDlg::~CEnumWindowsDlg()
- {
- }
- void CEnumWindowsDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Control(pDX, IDC_LIST_WINDOWS, m_ListWnds);
- }
- BEGIN_MESSAGE_MAP(CEnumWindowsDlg, CDialog)
- ON_WM_DESTROY()
- ON_BN_CLICKED(IDC_BUTTON_REFRUSH, &CEnumWindowsDlg::OnBnClickedButtonRefrush)
- END_MESSAGE_MAP()
- // CEnumWindowsDlg 消息处理程序
- void CEnumWindowsDlg::OnDestroy()
- {
- CDialog::OnDestroy();
- // TODO: 在此处添加消息处理程序代码
- if (m_ImgList.GetSafeHandle())
- {
- m_ImgList.DeleteImageList();
- }
- }
- BOOL CEnumWindowsDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // TODO: 在此添加额外的初始化
- CRect rect;
- m_ListWnds.GetClientRect(rect);
- //获得原有风格
- DWORD dwStyle = ::GetWindowLong(m_ListWnds.m_hWnd, GWL_STYLE);
- dwStyle &= ~(LVS_TYPEMASK);
- dwStyle &= ~(LVS_EDITLABELS);
- //设置新风格
- SetWindowLong(m_ListWnds.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
- //设置扩展风格
- DWORD styles =LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES;
- ListView_SetExtendedListViewStyleEx(m_ListWnds.m_hWnd, styles, styles );
- LV_COLUMN lvcolumn;
- TCHAR rgtsz[2][10] = {_T( "任务" ), _T( "状态" )};
- for ( int i=0;i<2;i++)
- {
- lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
- lvcolumn.fmt = LVCFMT_LEFT;
- lvcolumn.pszText = rgtsz[i];
- lvcolumn.iSubItem = i;
- lvcolumn.iOrder = i;
- if (i==0)
- lvcolumn.cx = rect.Width()*3/5 ;
- else
- lvcolumn.cx = rect.Width()*2/5;
- m_ListWnds.InsertColumn(i, &lvcolumn);
- }
- GetOSVersion();
- OnBnClickedButtonRefrush();
- return TRUE; // return TRUE unless you set the focus to a control
- // 异常: OCX 属性页应返回 FALSE
- }
- void CEnumWindowsDlg::SaveIcon( HICON hIconToSave, LPCTSTR sIconFileName)
- {
- if (hIconToSave==NULL || sIconFileName==NULL)
- return ;
- //warning: this code snippet is not bullet proof.
- //do error check by yourself [masterz]
- PICTDESC picdesc;
- picdesc.cbSizeofstruct = sizeof (PICTDESC);
- picdesc.picType = PICTYPE_ICON ;
- picdesc.icon.hicon = hIconToSave;
- IPicture* pPicture=NULL;
- OleCreatePictureIndirect(&picdesc, IID_IPicture, TRUE,( VOID **)&pPicture);
- LPSTREAM pStream;
- CreateStreamOnHGlobal(NULL,TRUE,&pStream);
- LONG size;
- HRESULT hr=pPicture->SaveAsFile(pStream,TRUE,&size);
- char pathbuf[1024];
- strcpy(pathbuf,sIconFileName);
- CFile iconfile;
- iconfile.Open(pathbuf, CFile::modeCreate|CFile::modeWrite);
- LARGE_INTEGER li;
- li.HighPart =0;
- li.LowPart =0;
- ULARGE_INTEGER ulnewpos;
- pStream->Seek( li,STREAM_SEEK_SET,&ulnewpos);
- ULONG uReadCount = 1;
- while (uReadCount>0)
- {
- pStream->Read(pathbuf, sizeof (pathbuf),&uReadCount);
- if (uReadCount>0)
- iconfile.Write(pathbuf,uReadCount);
- }
- pStream->Release();
- iconfile.Close();
- }
- BOOL CALLBACK CEnumWindowsDlg::enumProc( HWND hwnd, LPARAM lParam)
- {
- if (hwnd == NULL)
- {
- return FALSE;
- }
- CEnumWindowsDlg * pDlg = (CEnumWindowsDlg *)lParam;
- if ( hwnd == pDlg->m_hWnd ) //这是为了不把自己这个程序列出来
- {
- return TRUE;
- }
- if (::IsWindow(hwnd) && ::IsWindowVisible(hwnd) && /
- ((GetWindowLong(hwnd, GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW)&&/
- (GetWindowLong(hwnd, GWL_HWNDPARENT)==0))
- {
- TCHAR szCap[255] = {0};
- ::GetWindowText(hwnd, szCap, 255);
- if (strlen(szCap) == 0)
- {
- return TRUE;
- }
- CString strText( "" );
- pDlg->GetParent()->GetWindowText(strText);
- if (lstrcmp(strText,szCap) == 0)
- {
- return TRUE;
- }
- TRACE( "%s/n" ,szCap);
- pDlg->InsertListItem(hwnd,szCap);
- }
- return TRUE;
- }
- void CEnumWindowsDlg::InsertListItem( HWND hwnd,CString strName)
- {
- HICON hIcon=GetWindowsIcon(hwnd);
- if (m_bLoadIcon)
- {
- m_ImgList.Add(hIcon);
- return ;
- }
- bool bRun=bWindowsRun(hwnd);
- int nIndex =m_ListWnds.GetItemCount();
- LV_ITEM lvitemAdd = {0};
- lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
- lvitemAdd.iItem = nIndex ;
- lvitemAdd.iSubItem = 0;
- lvitemAdd.pszText =( LPSTR )( LPCSTR )strName;
- lvitemAdd.iImage =nIndex;
- lvitemAdd.lParam = ( LPARAM )hwnd;
- if (m_ListWnds.InsertItem(&lvitemAdd) != -1){
- LV_ITEM lvitem = {0};
- lvitem.mask = LVIF_TEXT;
- lvitem.iItem = nIndex ;
- lvitem.iSubItem = 1;
- lvitem.pszText =_T( "正在运行" );
- m_ListWnds.SetItem(&lvitem);
- }
- }
- HICON CEnumWindowsDlg::GetWindowsIcon( HWND hwnd)
- {
- HICON hIcon = NULL;
- hIcon = ( HICON )::GetClassLong(hwnd,GCL_HICONSM);
- if (hIcon == NULL)
- {
- hIcon = ( HICON )::GetClassLong(hwnd,GCL_HICON);
- }
- if (hIcon == NULL)
- {
- hIcon = ( HICON )::SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0);
- }
- if (hIcon == NULL)
- {
- hIcon = ( HICON )::SendMessage(hwnd, WM_GETICON, ICON_BIG, 0);
- }
- return hIcon;
- }
- BOOL CEnumWindowsDlg::GetOSVersion()
- {
- BOOL bRetVal=TRUE;
- OSVERSIONINFO osver = {0};
- osver.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
- if (!GetVersionEx(&osver))
- {
- bRetVal = FALSE;
- }
- if (bRetVal == TRUE)
- {
- if (osver.dwPlatformId&VER_PLATFORM_WIN32_NT)
- {
- m_bIsNT = TRUE;
- }
- else
- {
- m_bIsNT = FALSE;
- }
- }
- //获取那两个函数指针
- HMODULE hUser32 = ::GetModuleHandle( "user32" );
- if (!hUser32)
- {
- bRetVal = FALSE;
- }
- if (bRetVal == TRUE)
- {
- m_pIsHungAppWindow = (PROCISHUNGAPPWINDOW)GetProcAddress( hUser32, "IsHungAppWindow" );
- m_pIsHungThread = (PROCISHUNGTHREAD) GetProcAddress( hUser32, "IsHungThread" );
- if (!m_pIsHungAppWindow && !m_pIsHungThread)
- {
- bRetVal = FALSE;
- }
- }
- return bRetVal;
- }
- BOOL CEnumWindowsDlg::bWindowsRun( HWND hwnd)
- {
- //于是判断,窗口是否是正常运行,还是未响应,代码如下
- BOOL bIsHung =FALSE;
- if (m_bIsNT == TRUE)
- bIsHung = m_pIsHungAppWindow(hwnd);
- else
- bIsHung =m_pIsHungThread(GetWindowThreadProcessId(hwnd,NULL));
- return bIsHung;
- }
- void CEnumWindowsDlg::CloseHwnd( HWND hwnd) //4.结束任务
- {
- ::PostMessage(hwnd,WM_CLOSE,0,0);
- //不过调用这个,有时候不一定一下能把窗口关了,比如窗口没响应了,就关不了
- ::PostMessage(hwnd,WM_CLOSE,0,0);
- ::Sleep(300);
- //如果窗口还没有被关,继续想办法
- if (::IsWindow(hwnd))
- {
- DWORD dwProcessID = 0;
- ::GetWindowThreadProcessId(hwnd,&dwProcessID);
- if (TerminateApp(dwProcessID,500) != TA_FAILED)
- {
- return ; //结束成功了
- }
- }
- return ;
- }
- //TerminateApp是这样的
- DWORD WINAPI CEnumWindowsDlg::TerminateApp( DWORD dwPID, DWORD dwTimeout )
- {
- HANDLE hProc ;
- DWORD dwRet ;
- // If we can't open the process with PROCESS_TERMINATE rights,
- // then we give up immediately.
- hProc = ::OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,dwPID);
- if (hProc == NULL)
- {
- return TA_FAILED ;
- }
- // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
- // matches your process's.
- EnumWindows((WNDENUMPROC)TerminateAppEnum, ( LPARAM ) dwPID);
- // Wait on the handle. If it signals, great. If it times out,
- // then you kill it.
- if (WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0)
- dwRet=(TerminateProcess(hProc,0)?0x2L:0x0L); //TA_SUCCESS_KILL:TA_FAILED);
- else
- dwRet =0x1L; // TA_SUCCESS_CLEAN ;
- CloseHandle(hProc);
- return dwRet ;
- }
- //又有一个回调函数
- BOOL CALLBACK CEnumWindowsDlg::TerminateAppEnum( HWND hwnd, LPARAM lParam )
- {
- DWORD dwID ;
- ::GetWindowThreadProcessId(hwnd, &dwID) ;
- if (dwID == ( DWORD )lParam)
- {
- ::PostMessage(hwnd, WM_CLOSE, 0, 0) ;
- }
- return TRUE ;
- }
- void CEnumWindowsDlg::OnBnClickedButtonRefrush()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_ListWnds.DeleteAllItems();
- if (m_ImgList.GetSafeHandle())
- {
- m_ImgList.DeleteImageList();
- }
- m_ImgList.Create(16,16,TRUE|ILC_COLOR24,4,1);
- m_bLoadIcon= true ;
- EnumWindows((WNDENUMPROC)enumProc,( LPARAM ) this );
- m_bLoadIcon= false ;
- EnumWindows((WNDENUMPROC)enumProc,( LPARAM ) this );
- m_ListWnds.SetImageList(&m_ImgList,LVSIL_SMALL);
- }
获取任务管理器中的任务来源于 http://www.wangchao.net.cn/bbsdetail_901859.html
其它部分做了一些修改
#include <tlhelp32.h>
#pragma comment(lib,"kernel32.lib")
//枚举一个进程的模块信息
void EnumModule(DWORD dwPID=0)
{
// 枚举Module: Take a snapshot of all modules in the specified process.
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 me32 = {0};
me32.dwSize = sizeof(MODULEENTRY32);
BOOL bResult = Module32First(hModuleSnap, &me32);
while (bResult)
{
TRACE("%s/n" , me32.szExePath);
bResult = Module32Next(hModuleSnap, &me32);
}
// 关闭快照句柄
CloseHandle (hModuleSnap);
}
}
//枚举进程void EnumProcess()
{
// 枚举进程:
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hModuleSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 peProcess = {sizeof(PROCESSENTRY32)};
BOOL bResult = Process32First(hModuleSnap, &peProcess);
while (bResult)
{
// 在此就能获得所有进程
TRACE("%s/n", peProcess.szExeFile);
bResult = Process32Next(hModuleSnap, &peProcess);
}
// 关闭快照句柄
CloseHandle (hModuleSnap);
}
}