開發一個簡易的任務監控程式
需求:時刻監控任務列表,如果需要一直啟動的程式未開啟,則開啟
實現:
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獲取程序所對應的執行檔案路徑,需要實現邏輯裝置名對映碟符的問題
3、開啟程序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; }
//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實戰這本書實際動手做了這個樣