1. 程式人生 > >開發一個簡易的任務監控程式

開發一個簡易的任務監控程式


需求:時刻監控任務列表,如果需要一直啟動的程式未開啟,則開啟

實現:

1、列舉當前已經啟動的程序、獲取程序的ID和名稱

	vector<cstring> launchedProcess;
	HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//建立當前快照列表
	PROCESSENTRY32* info=new PROCESSENTRY32;//建立程序資訊變數,用於儲存資訊
	info->dwSize=sizeof(PROCESSENTRY32);//設定塊大小
	int i=0;
	if(Process32First(handle,info))//開始列舉程序
	{
		if(GetLastError()==ERROR_NO_MORE_FILES )
		{
			AfxMessageBox(_T("No More Process"));
		}
		else
		{
			CString id,file;
			id.Format(L"%d",info->th32ProcessID);//獲取當前程序ID
			file.Format(L"%s",info->szExeFile);//獲取當前程序名

			////TRACE(L"ID:%s,Name:%s",id,file);

			launchedProcess.push_back(file);

			if(!isExistInList(id,file))
			{
				m_list.InsertItem(i,id);//插入一個專案
				m_list.SetItemData(i,info->th32ProcessID);//設定專案值
				m_list.SetItemText(i,1,file);//設定名
				i++;
			}
			while(Process32Next(handle,info)!=FALSE)//繼續獲取程序
			{
				id.Format(L"%5d",info->th32ProcessID);
				file.Format(L"%s",info->szExeFile);

				launchedProcess.push_back(file);

				if(!isExistInList(id,file))
				{
					m_list.InsertItem(i,id);
					m_list.SetItemData(i,info->th32ProcessID);
					m_list.SetItemText(i,1,file);
					i++;
				}
			}
		}
	}
	delete info;//參考博文中未新增
	CloseHandle(handle);//關閉程序控制代碼</cstring>

2、通過程序ID獲取程序所對應的執行檔案路徑,需要實現邏輯裝置名對映碟符的問題

HANDLE hProcess = NULL;  
	BOOL bSuccess = FALSE;  
	
	// 由於程序許可權問題,有些程序是無法被OpenProcess的,如果將呼叫程序的許可權  
	// 提到“除錯”許可權,則可能可以開啟更多的程序  
	hProcess = OpenProcess(   
		PROCESS_QUERY_INFORMATION | PROCESS_VM_READ ,   
		FALSE, dwProcessId );  

	CString path(_T(""));
	do   
	{  
		if ( NULL == hProcess )  
		{  
			// 開啟控制代碼失敗,比如程序為0的程序  
			break;  
		}  
		
		// 用於儲存檔案路徑,擴大一位,是為了保證不會有溢位  
		TCHAR szPath[_MAX_PATH + 1] = {0};  
		
		// 模組控制代碼  
		HMODULE hMod = NULL;  
		// 這個引數在這個函式中沒用處,僅僅為了呼叫EnumProcessModules  
		DWORD cbNeeded = 0;  
		
#if 0		
		// 【注】此種方法Win7-64bit cmd.exe獲取不到路徑(同時勾選dbgview、chrome、beyondcompare、cmd)
		
		// 獲取路徑  
		// 因為這個函式只是要獲得程序的Exe路徑,因為Exe路徑正好在返回的資料的  
		// 第一位,則不用去關心cbNeeded,hMod裡即是Exe檔案的控制代碼.  
		// If this function is called from a 32-bit application running on WOW64,   
		// it can only enumerate the modules of a 32-bit process.   
		// If the process is a 64-bit process,   
		// this function fails and the last error code is ERROR_PARTIAL_COPY (299).  
		if( FALSE == EnumProcessModules( hProcess, &hMod,   
			sizeof( hMod ), &cbNeeded ) )  
		{  
			break;
		}  
		
		// 通過模組控制代碼,獲取模組所在的檔案路徑,此處即為程序路徑。  
		// 傳的Size為_MAX_PATH,而不是_MAX_PATH+1,是因為保證不會存在溢位問題  
		if ( 0 == GetModuleFileNameEx( hProcess, hMod, szPath, _MAX_PATH ) )  
		{  
			break;  
		}  
#endif

#if 1
		TCHAR szWinPath[_MAX_PATH + 1] = {0};

		//http://www.codeproject.com/Questions/282205/Get-Path-all-of-opened-Windows-WinAPI
		HINSTANCE hinstLib; 
		typedef DWORD (WINAPI *FPGetProcessImageFileName)(HANDLE,LPTSTR,DWORD); 
		FPGetProcessImageFileName fpGetProcessImageFileName = NULL; 
		
		// Get a handle to the DLL module.
		GetWindowsDirectory(szWinPath,sizeof(szWinPath));
		path.Format(L"%s\\SYSTEM32\\psapi.dll",szWinPath);
		
		////TRACE(L"path:%s",(LPCTSTR)path);

		hinstLib = ::LoadLibrary((LPCTSTR)path); 
		if (hinstLib != NULL) 
		{
#ifdef UNICODE
#define GetProcessImageFileNameStr  "GetProcessImageFileNameW"
#else
#define GetProcessImageFileNameStr  "GetProcessImageFileNameA"
#endif // !UNICODE

			//http://blog.163.com/
[email protected]
/blog/static/109412748201141425648762/ CString strFunName = _T(GetProcessImageFileNameStr); CStringA strFunNameA(strFunName); fpGetProcessImageFileName = (FPGetProcessImageFileName) ::GetProcAddress(hinstLib, strFunNameA); // If the function address is valid, call the function. if (NULL != fpGetProcessImageFileName) { // if(!fpGetProcessImageFileName(hProcess, szPath, _MAX_PATH)) GetLastError(); } } else { AfxMessageBox(_T("psapi.dll not found")); } // Free the DLL when you are done. ::FreeLibrary(hinstLib); #endif #if 0 if(!GetProcessImageFileName(hProcess, szPath, _MAX_PATH)) { break; } #endif // 儲存檔案路徑 path = szPath; // //TRACE(L"%s",(LPCTSTR)path); // 查詢成功了 #if 1 CString deviceName(_T("")); int num=0;//第三次出現\的位置左邊即為邏輯裝置名 //"\Device\HarddiskVolume2\Windows\System32\cmd.exe" for(int i=0;i<path.GetLength();i++) { if(path.GetAt(i)=='\\') { num++; if(num == 3) { deviceName.Empty(); deviceName = path.Left(i); path = path.Right(path.GetLength()-i-1); ////TRACE(L"logicVolume:%s,path:%s",logicVolume,path); break; } } } //TRACE(L"deviceName---%s",deviceName); std::map<CString, CString>::iterator iterator1; std::map<CString, CString>::iterator Enditerator1 = m_mapDevicePath.end(); for(iterator1 = m_mapDevicePath.begin();iterator1 != Enditerator1; iterator1++) { //TRACE(L"iterator---%s",iterator1->first); CStringA left(iterator1->first); CStringA right(deviceName); //TRACE(L"left---%s",left); //TRACE(L"right---%s",right); if(!left.Compare(right)) { //TRACE("helloworld"); } if(!iterator1->first.Compare(deviceName)) { //TRACE(L"iterator===%s",iterator1->first); //TRACE(L"m_mapDevicePath---%s",m_mapDevicePath[deviceName]); deviceName = iterator1->second; break; } } //TRACE(L"deviceName---%s",deviceName); path = deviceName + path; TRACE(L"path---%s",path); cstrPath = path; path.Empty(); #endif /****** //兩種由邏輯裝置名對映碟符的解決連結 //http://bbs.csdn.net/topics/330144410 //IoVolumeDeviceToDosName()//需要ddk驅動神馬的,超級麻煩,驅動用的 //vc6.0不支援,被迫遷移到vs8,一下超連結部分的程式碼可直接拷貝編譯執行 //http://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx ******/ if(cstrPath.GetLength()) bSuccess = TRUE; } while( 0 ); // 釋放控制代碼 if ( NULL != hProcess ) { CloseHandle( hProcess ); hProcess = NULL; }
3、開啟程序
//http://blog.csdn.net/itjobtxq/article/details/6233455
			SHELLEXECUTEINFO ShExecInfo = {0};
			ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
			ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
			ShExecInfo.hwnd = NULL;
			ShExecInfo.lpVerb = NULL;
			ShExecInfo.lpFile = m_daemonModulePath[i];
			ShExecInfo.lpParameters =_T("");
			ShExecInfo.lpDirectory = NULL;
			ShExecInfo.nShow = SW_SHOW;
			ShExecInfo.hInstApp = NULL;
			ShellExecuteEx(&ShExecInfo);
			WaitForSingleObject(ShExecInfo.hProcess,100);

			launchedProcess.push_back(m_daemonModulePath[i]);

4、邊邊角角的需求:只啟用一個例項;最小化時工作列不顯示,只在後臺中執行;再點選exe的圖示,啟用後臺程序顯示主視窗

其中需求4的最後一個小需求在vs2008生成的執行檔案裡會失敗

最終程式截圖:

vc6.0                                                                                                              vs2008


相關推薦

開發一個簡易任務監控程式

需求:時刻監控任務列表,如果需要一直啟動的程式未開啟,則開啟 實現: 1、列舉當前已經啟動的程序、獲取程序的ID和名稱 vector<cstring> launchedProcess; HANDLE handle=CreateToolhelp32Sn

jQuery 開發一個簡易插件

logs spa 簡易 cnblogs jquer on() pre options ron jQuery 開發一個簡易插件 //主要內容 $.changeCss = function(options){ var defaults = {

開發一個簡易ATM機

能實現的功能: 1,密碼超過3次沒有輸對程式死掉,取款失敗,2,密碼輸入正確後,顯示銀行卡里的可用餘額,輸入取款金額(金額至少是100起步,且只能是整百的取,金額不能超過1萬元),錢取了之後要自動計算出銀行卡里的剩餘金額。3,使用者可以存錢。 補充:密碼初始化自己定義(長度

使用Struts2 開發一個簡易的《B2C電子商務網站》 。個人自擬題目,選擇一大類商品,實現此網站。比如圖書、電子圖書、運動鞋、嬰兒用品、家電、手機、電腦等等。

必須使用struts2、Hibernate,網站主要包括以下功能: 主頁:以文字與圖片的形式介紹此商務網站,並內含使用者登陸入口及新使用者的註冊超鏈。 使用者註冊:輸入使用者郵箱地址或手機號碼,完成使用者註冊。要求(1)使用struts2相關技術對郵箱地址和手機號碼進行合

C# GUI+開發一個簡易畫板

利用C#的視窗程式開發一個簡易畫板 父窗體 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;

用PyQt5開發一個簡易的計算器

效果圖: 介面程式碼 calc_interface.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'calc_interface

Qt開發-使用QWebEngineView開發一個簡易的瀏覽器(一)

        簡單的一個程式,在之前文章的WebEngineView上增加了幾個小功能         環境:Qt5.9.1 QtCreator Win7 環境配置:http://blog.csdn.net/m32692529/article/details/78788

開發一個簡易音樂播放器

本人初學Android,最近做了一個實現安卓簡單音樂播放功能的播放器,收穫不少,於是便記錄下來自己的思路與知識總結,重溫自己的探索之路。 1  那麼先上幾張截圖來看下程式實現效果吧 2 可以看出基本實現的功能有 暫停(播放),上(下)一首,停止播放

.NETCore 快速開發一個簡易商城

ref 安裝文件 數據庫關系圖 cor 嘗試 價值 hub 思想 soft 介紹 上一篇介紹 《.NETCore 基於 dbfirst 體驗快速開發項目》,講得不太清楚有些多人沒看懂。這次吸取教訓,將一個簡易商城做為案例,現實快速開發。 本案例用於演示或學習,不具有商業價

開發一個基於React Native的簡易demo--視訊元件+佈局

一、視訊元件 yarn add --save react-native-video react-native link 編碼 import Video from 'react-native-video'; ... <Video r

【重學Node.js 第4篇】實現一個簡易爬蟲&啟動定時任務

實現一個簡易爬蟲&啟動定時任務 課程介紹看這裡:https://www.cnblogs.com/zhangran/p/11963616.html 專案github地址:https://github.com/hellozhangran/happy-egg-server 爬蟲 目前 node.js 爬蟲工

基於OpenGL編寫一個簡易的2D渲染框架-04 繪制圖片

著色器 drawtext 結構 渲染 images ron renderer make 制圖 閱讀文章前需要了解的知識,紋理:https://learnopengl-cn.github.io/01%20Getting%20started/06%20Textures/  

基於OpenGL編寫一個簡易的2D渲染框架-05 渲染文本

new 坐標 false 證明 ont 獲取 simple 了解 param 閱讀文章前需要了解的知識:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 簡要步

jsp做的一個簡易留言板功能

cti var llb onload 計算 bst image message html 1.先登錄才能留言 2.可以留言 3.可以回復 4.自己寫的留言可以自己刪除 5.留言進行分頁顯示,避免留言只能顯示一部分 1.登錄後會有 2.寫留言 提交按鈕在你沒寫東西前是

ASP.NET一個簡易的WebServer,用控制臺程序模擬IIS 托起web服務

public 程序 控制臺 ProcessRequestHandler( page, query, TextWriter writer); WebServer : MarshalByRefObject, IRegisteredObject { Pro

javascript的一個簡易利率計算器+js圖像顯示 代碼

貸款 under 格式 principal 定時 request對象 for char 直線 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <

關於一個簡易的實時內存監控系統的思維導圖

title 小項目 pan 基礎上 python 思維導圖 內存監控 cnblogs com 非常感謝愛蘑菇的狗的文章(原文引用:http://www.cnblogs.com/shengxinjing/p/python.html),建議可以先從頭跟著這一篇文章做

Angular2-編寫一個簡易的組件

span 裝飾器 cto 理解 log 完整 col 編寫 {}   Angular2組件可以這麽理解:編寫一個類,然後在類的上面用組件裝飾器裝飾一下,這個類就成組件了。   所以編寫組件分兩步:1)編寫類;2)編寫裝飾器   1)編寫類: export class Si

力軟敏捷開發框架,至美UI,強大功能組件,給開發一個加速度!

src str 能夠 nal 辦公 主從表 可視化 程序 多個 力軟敏捷開發框架,軟件行業的3D打印機、整合框架,給用戶和開發者最佳的.Net框架方案。 力軟敏捷開發框架是一套集快速開發+通用權限管理+工作流+即時通訊+微信組件+手機APP開發於一體的敏捷開發框架。 能幫企

HBase概念學習(八)開發一個類twitter系統之表設計

至少 創建用戶 列表 ase wke long 少包 mali 。。 這邊文章先將可能的需求分析一下,設計出HBase表,下一步再開始編寫client代碼。 TwiBase系統 1、背景 為了加深HBase基本概念的學習,參考HBase實戰這本書實際動手做了這個樣