分享
 
 
 

VC中枚举所有的任务,任务管理器的一些资料的整理

王朝vc·作者佚名  2007-04-30
窄屏简体版  字體: |||超大  

1.列举所有的任务

调用EnumWindows这个函数

BOOL EnumWindows(

WNDENUMPROC lpEnumFunc, // callback function

LPARAM lParam // application-defined value

);

如:

::EnumWindows((WNDENUMPROC)enumProc,(LPARAM)this);

enumProc就是那个回调函数,真正的操作,都在这个函数里实现

第二个参数,是用户自定义传送的,比如这里,可以是对话框的指针

enumProc的原型是

BOOL CALLBACK CPListDlg::enumProc(HWND hwnd, LPARAM lParam)

如果是类成员函数,必须是static函数,声明如下

BOOL static CALLBACK enumProc(HWND hwnd, LPARAM lParam);

其中,那个HWND hwnd就是窗口句柄

BOOL CALLBACK CPListDlg::enumProc(HWND hwnd, LPARAM lParam)

{

CPListDlg * pDlg = (CPListDlg *)lParam;

if (hwnd == NULL)

{

return FALSE;

}

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;

}

if (lstrcmp(_T("Program Manager"),szCap) == 0)

{

return TRUE;

}

DWORD dwProcessID = 0;

::GetWindowThreadProcessId(hwnd,&dwProcessID);

TRACE( "id = %d, name = %s\n", dwProcessID, szCap );

}

return TRUE;

}

GetWindowThreadProcessId是获取进行的ID的

if (lstrcmp(_T("Program Manager"),szCap) == 0)

是为了区别出Program Manager这个程序,不知道为什么,会列出这个东西来,晕

2.获取窗口的图标

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);

}

记得当时做的时候,有这些代码是因为,有些窗口的图标不能获得,用了上述办法以后,才能全部获得

3.判断窗口是否是正常运行还是未响应的

首先定义两个函数指针,

typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW)(HWND);

typedef BOOL (WINAPI *PROCISHUNGTHREAD)(DWORD);

然后定义

PROCISHUNGAPPWINDOW m_pIsHungAppWindow;

PROCISHUNGTHREAD m_pIsHungThread;

定义一个bool型,来判断当前操作系统是否是Windows NT/2000以上

因为不同的操作系统,判断程序是否运行正常的方式是不一样的

BOOL m_bIsNT;

获取版本信息

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;

}

}

于是判断,窗口是否是正常运行,还是未响应

代码如下

if(m_bIsNT == TRUE)

{

BOOL bIsHung = m_pIsHungAppWindow(hwnd);

if(bIsHung)

{

//没有响应

}

else

{

//正在运行

}

}

else

{

BOOL bIsHung =m_pIsHungThread(GetWindowThreadProcessId(hwnd,NULL));

if(bIsHung)

{

//没有响应

}

else

{

//正在运行

}

}

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)

{

//结束成功了

}

}

TerminateApp是这样的

DWORD WINAPI CPListDlg::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)?TA_SUCCESS_KILL:TA_FAILED);

else

dwRet = TA_SUCCESS_CLEAN ;

CloseHandle(hProc) ;

return dwRet ;

}

又有一个回调函数

BOOL CALLBACK CPListDlg::TerminateAppEnum( HWND hwnd, LPARAM lParam )

{

DWORD dwID ;

::GetWindowThreadProcessId(hwnd, &dwID) ;

if(dwID == (DWORD)lParam)

{

::PostMessage(hwnd, WM_CLOSE, 0, 0) ;

}

return TRUE ;

}

原型是

BOOL static CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) ;

这是以前做的一个任务管理器的相关代码,有很多欠缺的地方,也一直没有改进,这次把它整理出来了,如果有不对的地方,希望得到大家的指正~~~

关于,如何把这些信息显示出来,比如在listctrl中显示出来,我就不多说了,可以参考博客中的另一文章,“VC中使用ListCtrl经验总结(1)”

参考文章

关于如何判断程序的状态……………………

http://www.vckbase.com/bbs/prime/viewprime.asp?id=334

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有