版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 進(jìn)程管理器課程設(shè)計(jì)</b></p><p><b> 題目:進(jìn)程管理器</b></p><p><b> 目錄</b></p><p> 一、需求與功能分析2</p><p> 二、系統(tǒng)總體框架4</p><p>
2、; 2.1 系統(tǒng)框架圖4</p><p> 2.2 各功能模塊的詳細(xì)說(shuō)明4</p><p> 三、模塊設(shè)計(jì)與分析5</p><p> 3.1 獲取進(jìn)程模塊5</p><p> 3.2 啟動(dòng)新進(jìn)程模塊6</p><p> 3.3 終止進(jìn)程模塊8</p><p> 3.4
3、退出模塊10</p><p> 四、類(lèi)的設(shè)計(jì)與分析11</p><p> 4.1、CShowAllProcessApp 類(lèi)11</p><p> 4.2 CaboutDlg 類(lèi)11</p><p> 4.3、CshowAllProcessDlg 類(lèi)12</p><p> 4.4、CSXButton
4、類(lèi)13</p><p><b> 六、功能測(cè)試15</b></p><p> 七、存在的不足與對(duì)策18</p><p> 八、程序源代碼19</p><p><b> 一、需求與功能分析</b></p><p> 我們的電腦需要我們?nèi)チ私馑倪\(yùn)行狀況,掌握和
5、管理它的進(jìn)程,并對(duì)其異常情況給予操作和控制,進(jìn)程管理器就像是我們了解和控制自己電腦運(yùn)作的一個(gè)窗口,通過(guò)這個(gè)窗口我們可以了解到電腦所有進(jìn)程運(yùn)行狀況,并對(duì)運(yùn)行的進(jìn)程加于管理和控制,正如在本實(shí)驗(yàn)中,啟動(dòng)進(jìn)程管理器后,可以通過(guò)”獲取進(jìn)程”功能來(lái)獲得本計(jì)算機(jī)啟動(dòng)的進(jìn)程,以及與該進(jìn)程相關(guān)的信息,其中包括的信息有:進(jìn)程映像名稱(chēng),進(jìn)程開(kāi)啟的線(xiàn)程數(shù),進(jìn)程的 PID 以及進(jìn)程的優(yōu)先數(shù),我們可以通過(guò)這些信息來(lái)了解計(jì)算機(jī)中每個(gè)進(jìn)程的使用狀況。同時(shí)我們可以在進(jìn)程
6、管理器上選中一個(gè)要終止的的進(jìn)程,點(diǎn)擊“終止進(jìn)程”功能按鈕,該進(jìn)程被終止執(zhí)行并退出進(jìn)程列表,其中還包括了自動(dòng)刷新的功能,此按鈕實(shí)現(xiàn)的功能正如我們電腦任務(wù)管理器的 “進(jìn)程”功能,當(dāng)電腦執(zhí)行程序不能通過(guò)關(guān)閉窗口進(jìn)行正常的關(guān)閉時(shí),可以借助此辦法來(lái)關(guān)閉進(jìn)程。我們還可以通過(guò)這個(gè)進(jìn)程管理器來(lái)啟動(dòng)新的進(jìn)程,當(dāng)我們要在進(jìn)程管理器里啟動(dòng)新的進(jìn)程時(shí),只要點(diǎn)擊“啟動(dòng)新進(jìn)程”按鍵,則會(huì)彈出“打開(kāi)進(jìn)程”對(duì)話(huà)框,我們可以通過(guò)對(duì)話(huà)框里的“瀏覽”窗口選擇要打開(kāi)的新進(jìn)程,
7、這是任務(wù)管理器里沒(méi)有實(shí)現(xiàn)的功能,通過(guò)這個(gè)功能我們?cè)诠芾碛?jì)算機(jī)時(shí)變得更加靈活方</p><p><b> 二、系統(tǒng)總體框架</b></p><p><b> 2.1 系統(tǒng)框架圖</b></p><p> 本系統(tǒng)設(shè)計(jì)比較簡(jiǎn)潔,用 MFC 來(lái)做界面,實(shí)現(xiàn)了四個(gè)功能,顯示四類(lèi)與進(jìn)程相關(guān)的信息,具體的總體框架圖如圖1 所示:&
8、lt;/p><p><b> \</b></p><p><b> 圖1 總體框架圖</b></p><p> 2.2 各功能模塊的詳細(xì)說(shuō)明 </p><p> 本系統(tǒng)實(shí)現(xiàn)了四大功能,分別包括了:獲取進(jìn)程、啟動(dòng)新進(jìn)程、終止進(jìn)程和退出管理器,各功能模塊的詳細(xì)說(shuō)明如下: </p>&l
9、t;p> ?。?)獲取進(jìn)程。點(diǎn)擊獲取進(jìn)程后,它能自動(dòng)獲取計(jì)算機(jī)的所有進(jìn)程,并顯示進(jìn)程的相關(guān)信息,其中包括的信息有:進(jìn)程映像名稱(chēng),進(jìn)程開(kāi)啟的線(xiàn)程數(shù),進(jìn)程的 PID 以及進(jìn)程的優(yōu)先數(shù),通過(guò)這一功能,我們能了解進(jìn)程的相關(guān)情況。</p><p> (2)啟動(dòng)新進(jìn)程。點(diǎn)擊“啟動(dòng)新進(jìn)程”按鈕,進(jìn)入“打開(kāi)進(jìn)程”對(duì)話(huà)框,在“瀏覽”窗口里選擇任意一個(gè)應(yīng)用程序,則能在管理器里直接啟動(dòng)我們所選的進(jìn)程。</p>&
10、lt;p> ?。?)終止進(jìn)程。當(dāng)我們遇到某些軟件在關(guān)閉窗口時(shí)不能直接關(guān)閉,這時(shí)可以在進(jìn)程管理器的 “終止進(jìn)程”里找到該進(jìn)程并將其終止,這一功能實(shí)現(xiàn)的是類(lèi)似于任務(wù)管理器的“進(jìn)程”選項(xiàng)所具有的功能。 </p><p> ?。?)退出管理器。當(dāng)對(duì)管理器操作做完畢時(shí),直接點(diǎn)擊“退出管理器“按鈕則可關(guān)閉管理器。 </p><p><b> 三、模塊設(shè)計(jì)與分析</b>&l
11、t;/p><p> 本軟件實(shí)現(xiàn)了進(jìn)程管理的三大功能,其中主要用到了三大函數(shù),包括獲取進(jìn)程函數(shù) “OnGetProcess”、啟動(dòng)新進(jìn)程函數(shù)“Ononrun”、終止進(jìn)程函數(shù)“OnStopProcess”以及退出管理器函數(shù)“OnBnClickedCancel”,以下是對(duì)每個(gè)程序的詳細(xì)設(shè)計(jì):</p><p> 3.1 獲取進(jìn)程模塊</p><p> 該模塊使用到的控件如
12、表1:</p><p> 在IDOK控件上建立事件OnGetProcess(),當(dāng)用戶(hù)點(diǎn)擊“獲取進(jìn)程”按扭時(shí)事件發(fā)生,進(jìn)程管理器可以獲取計(jì)算機(jī)的所有進(jìn)程。</p><p><b> 函數(shù)源代碼如下:</b></p><p> void CShowAllProcessDlg::OnGetProcess() //獲取進(jìn)程的消息處理函數(shù) <
13、;/p><p> { // TODO: Add your control notification handler code here HANDLE Snapshot; Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //獲得某一時(shí)刻系統(tǒng)的進(jìn)程、堆(heap)、模塊(module)或線(xiàn)程的快照信息</p><p> PROC
14、ESSENTRY32 processListStr; //獲得進(jìn)程的信息 processListStr.dwSize=sizeof(PROCESSENTRY32); </p><p> BOOL return_value; return_value=Process32First(Snapshot,&processListStr);</p><p> //獲得系統(tǒng)進(jìn)程鏈表中第一
15、個(gè)進(jìn)程的信息</p><p> m_showlist.DeleteAllItems();</p><p> int i=0;//item index 5</p><p> while(return_value)</p><p><b> { </b></p><p> m_showlis
16、t.InsertItem(i,processListStr.szExeFile,0); //插入第一項(xiàng),從零開(kāi)始插入</p><p> CString s;</p><p> s.Format("%d",processListStr.cntThreads); //輸出線(xiàn)程</p><p> m_showlist.SetItemText(i,
17、1,s);</p><p> s.Format("%d",processListStr.th32ParentProcessID); //輸出ID</p><p> m_showlist.SetItemText(i,2,s); </p><p> s.Format("%d",processListStr.pcPriClas
18、sBase); //輸出優(yōu)先數(shù)</p><p> m_showlist.SetItemText(i,3,s); </p><p> int memory=processListStr.cntThreads; //寫(xiě)入內(nèi)存 m_ProcessIndex[i]=processListStr.th32ProcessID;//save ID into array to teminate ret
19、urn_value=Process32Next(Snapshot,&processListStr); //獲得系統(tǒng)進(jìn)程鏈表中下一個(gè)進(jìn)程的信息</p><p><b> i++; </b></p><p><b> }</b></p><p><b> } </b></p>
20、<p> 功能實(shí)現(xiàn)的流程圖如圖2所示:</p><p> 圖2 獲取進(jìn)程流程圖</p><p> 3.2 啟動(dòng)新進(jìn)程模塊 </p><p> 該模塊使用到的控件情況如表2:</p><p> void CShowAllProcessDlg::Ononrun() //啟動(dòng)新進(jìn)程的消息處理函數(shù) </p><
21、p><b> { </b></p><p> // TODO: Add your control notification handler code here </p><p> //加載動(dòng)態(tài)鏈接庫(kù) </p><p> CString pszDllName="shell32.dll";</p>&
22、lt;p> HINSTANCE hLib = ::LoadLibrary(pszDllName); // 定義一個(gè)句柄,獲取的dll文件,是相對(duì)路徑,和.exe文件在同一個(gè)目錄下</p><p> typedef void (__stdcall *pRunFileDlg)(HWND, HICON, LPCTSTR, LPCTSTR, LPCTSTR, UINT); pRunFileDlg RunFile
23、Dlg;</p><p> if (hLib==NULL) // 若hLib為空,加載失敗,hLib不為空,加載成功</p><p><b> { </b></p><p><b> return ;</b></p><p><b> } </b></p>
24、<p> RunFileDlg = (pRunFileDlg)GetProcAddress(hLib, (char *)61); </p><p> CString name ="打開(kāi)進(jìn)程";</p><p> CString sss = "請(qǐng)輸入程序,文件夾,文檔或其它東西。";</p><p> LPW
25、STR wname=new WCHAR[100]; </p><p> LPWSTR wsss=new WCHAR[100];</p><p> memset(wname,0,sizeof(WCHAR)*100);</p><p> memset(wsss,0,sizeof(WCHAR)*100);</p><p> MultiByt
26、eToWideChar //多字節(jié)字符到寬字符轉(zhuǎn)換函數(shù) </p><p> (CP_ACP, // ANSI轉(zhuǎn)換時(shí)所用的代碼頁(yè) </p><p> MB_PRECOMPOSED, // character-type options </p><p> name, // address of string to map</p><p>
27、 name.GetLength(), // number of bytes in string</p><p> wname, // address of wide-character buffer</p><p><b> 100</b></p><p><b> ); </b></p><p&
28、gt; MultiByteToWideChar //多字節(jié)字符到寬字符轉(zhuǎn)換函數(shù) </p><p> (CP_ACP, // ANSI轉(zhuǎn)換時(shí)所用的代碼頁(yè) </p><p> MB_PRECOMPOSED, // character-type options</p><p> sss, // address of string to map</p>
29、<p> sss.GetLength(), // number of bytes in string </p><p> wsss, // address of wide-character buffer</p><p><b> 100 </b></p><p><b> ); </b></p&
30、gt;<p> if(RunFileDlg!=NULL)</p><p><b> { </b></p><p> RunFileDlg(this->GetSafeHwnd(),NULL,NULL,(LPCTSTR)wname,(LPCTSTR)wsss,0x02);</p><p><b> }</
31、b></p><p> ::FreeLibrary(hLib); //函數(shù)運(yùn)行完畢后,卸載dll文件</p><p><b> }</b></p><p> 功能實(shí)現(xiàn)的流程圖如圖3所示:</p><p> 圖3 啟動(dòng)新進(jìn)程流程圖 </p><p> 3.3 終止進(jìn)程模塊 </
32、p><p> 該模塊使用到的控件情況表如表1:</p><p> 在IDC_STOP控件上建立事件OnStopProcess (),當(dāng)用戶(hù)選中其中一個(gè)進(jìn)程,并點(diǎn)擊“終止進(jìn)打開(kāi)進(jìn)程 選擇要啟動(dòng)的程序 hLib 是否為空 加載文件 函數(shù)運(yùn)行完畢, 卸載dll 文件 N 結(jié) 束 Y 10 程”按扭時(shí)事件發(fā)生,所選中的進(jìn)程被終止,進(jìn)程列表被更新。函數(shù)源代碼如下:</p><p&
33、gt; void CShowAllProcessDlg::OnStopProcess() //終止進(jìn)程的消息處理 </p><p><b> { </b></p><p> / TODO: Add your control notification handler code here </p><p> POSITION pos = m
34、_showlist.GetFirstSelectedItemPosition(); //要選擇的進(jìn)程所處的位置</p><p> int currentSelect=m_showlist.GetNextSelectedItem(pos); //當(dāng)前選中的行</p><p> if(currentSelect>0)</p><p><b> {
35、</b></p><p><b> //選擇某項(xiàng) </b></p><p> CString FileBuffer;//獲得進(jìn)程的可執(zhí)行文件的文件名</p><p> FileBuffer=CString(TEXT("確實(shí)要終止進(jìn)程 ")+m_showlist.GetItemText(currentSele
36、ct,0)+TEXT("?")); if(AfxMessageBox(FileBuffer,MB_OKCANCEL,0)==IDOK)</p><p> {//先獲得該進(jìn)程句柄,通過(guò)進(jìn)程標(biāo)識(shí)</p><p> HANDLE ProcessHandle; ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,FALSE,m_Proc
37、essIndex[currentSel ect]); //利用數(shù)組ID指定的獲得存在的一個(gè)進(jìn)程的句柄</p><p> if(ProcessHandle) {TerminateProcess(ProcessHandle,0); //使指定進(jìn)程結(jié)束 </p><p> AfxMessageBox("指定進(jìn)程已終止!"); </p><p>
38、OnGetProcess();//刷新顯示 </p><p><b> } </b></p><p> else {AfxMessageBox("系統(tǒng)不允許終止指定進(jìn)程!");</p><p><b> } </b></p><p><b> } </b&
39、gt;</p><p><b> } </b></p><p> else {AfxMessageBox("請(qǐng)先選擇一個(gè)需要終止的進(jìn)程!",MB_OK);</p><p><b> } </b></p><p><b> } </b></p&g
40、t;<p> 功能實(shí)現(xiàn)的流程圖如圖4所示:</p><p> 圖4 終止進(jìn)程流程圖圖 </p><p><b> 3.4 退出模塊 </b></p><p> 該模塊使用到的控件情況表如表1:</p><p> 在 I IDCANCEL 控件上建立事件 OnBnClickedCancel(),“退
41、出”按鈕響應(yīng)函數(shù),退出進(jìn)程管理器。函數(shù)源代碼如下:</p><p> void CShowAllProcessDlg::OnBnClickedCancel() //斷開(kāi)該連接"按鈕的響應(yīng)函數(shù) </p><p><b> { </b></p><p> IDCANCEL // TODO: 在此添加控件通知處理程序代碼</p&
42、gt;<p> OnCancel(); </p><p><b> }</b></p><p><b> 四、類(lèi)的設(shè)計(jì)與分析</b></p><p> 4.1、CShowAllProcessApp 類(lèi)</p><p> 以 CwinApp 為基類(lèi)創(chuàng)建 CShowAllProc
43、essApp 子類(lèi),它是應(yīng)用程序的入口和出口,在這里處理一些啟動(dòng)和退出程序時(shí)需要讀取或?qū)懭氲脑O(shè)置信息,以及設(shè)置一些全局變量。 CShowAllProcessApp 類(lèi)的定義如下:</p><p> class CShowAllProcessApp : public CwinApp // 函數(shù)頭文件中的應(yīng)用程序,</p><p> public: CShowAllProcessApp()
44、; </p><p> //整個(gè)程序中的應(yīng)用程序 </p><p> // Overrides </p><p> // ClassWizard generated virtual function overrides </p><p> //{{AFX_VIRTUAL(CShowAllProcessApp)</p>&
45、lt;p><b> public: </b></p><p> virtual BOOL InitInstance(); </p><p> //}}AFX_VIRTUAL </p><p> // Implementation </p><p> //{{AFX_MSG(CShowAllProcessA
46、pp) </p><p> // NOTE - the ClassWizard will add and remove member functions here.</p><p> // DO NOT EDIT what you see in these blocks of generated code ! </p><p> //}}AFX_MSG<
47、/p><p><b> }; </b></p><p> //用戶(hù)程序中的每個(gè)CCmdTarget 派生類(lèi)必須提供消息映射以處理消息,用這個(gè)函數(shù)了來(lái)處理用戶(hù)消息</p><p> DECLARE_MESSAGE_MAP()</p><p> 4.2 CaboutDlg 類(lèi)</p><p>
48、以 CDialog 為基類(lèi)創(chuàng)建 CAboutDlg 類(lèi),CAboutDlg 由 CDialog 派生而來(lái),用來(lái)處理進(jìn)程管理器的主窗口。CLockfileDlg 類(lèi)的定義如下:</p><p> class CAboutDlg : public CDialog </p><p><b> { </b></p><p><b> p
49、ublic: </b></p><p> CAboutDlg();</p><p> // Dialog Data </p><p> //{{AFX_DATA(CAboutDlg)</p><p> enum { IDD = IDD_ABOUTBOX }; //公有類(lèi)型 </p><p> //
50、}}AFX_DATA </p><p> // ClassWizard generated virtual function overrides </p><p> //{{AFX_VIRTUAL(CAboutDlg)</p><p> protected:</p><p> virtual void DoDataExchange(C
51、DataExchange* pDX); // 數(shù)據(jù)更新 </p><p> //}}AFX_VIRTUAL </p><p> // Implementation </p><p> protected: </p><p> //{{AFX_MSG(CAboutDlg) </p><p> //}}AFX_M
52、SG DECLARE_MESSAGE_MAP() // </p><p><b> }; </b></p><p> 4.3、CshowAllProcessDlg 類(lèi)</p><p> 以CDialog 為基類(lèi)創(chuàng)建CShowAllProcessDlg 子類(lèi)。 CLockfileDlg 類(lèi)的定義如下:</p><p>
53、; class CShowAllProcessDlg : public CDialog </p><p><b> { </b></p><p> // Construction </p><p><b> public:</b></p><p> DWORD m_ProcessIndex
54、[50];//存放所有進(jìn)程的ID </p><p> CShowAllProcessDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CShowAllProcessDlg)</p><p> enum { IDD = IDD_SHOWALLPROCESS_DIALOG }; &l
55、t;/p><p> CListCtrl m_showlist;</p><p> CSXButton m_show; </p><p> CSXButton m_exit;</p><p> CSXButton m_stop;</p><p> //}}AFX_DATA </p><p>
56、 // ClassWizard generated virtual function overrides</p><p> //{{AFX_VIRTUAL(CShowAllProcessDlg)</p><p> protected: </p><p> virtual void DoDataExchange(CDataExchange* pDX); //
57、DDX/DDV support </p><p> //}}AFX_VIRTUAL </p><p> // Implementation</p><p> protected: </p><p> HICON m_hIcon; </p><p> // Generated message map funct
58、ions </p><p> //{{AFX_MSG(CShowAllProcessDlg) </p><p> virtual BOOL OnInitDialog();</p><p> afx_msg void OnSysCommand(UINT nID, LPARAM lParam);</p><p> afx_msg void
59、 OnPaint(); </p><p> afx_msg HCURSOR OnQueryDragIcon(); </p><p> afx_msg void OnGetProcess(); </p><p> afx_msg void OnStopProcess(); </p><p> afx_msg void OnstartBU
60、TTON();</p><p> afx_msg void Ononrun(); </p><p> //}}AFX_MSG DECLARE_MESSAGE_MAP() </p><p><b> public: </b></p><p> afx_msg void OnBnClickedCancel();<
61、;/p><p><b> public: </b></p><p> afx_msg void OnLvnItemchangedListShow(NMHDR *pNMHDR, LRESULT *pResult);</p><p><b> };</b></p><p> 4.4、CSXButto
62、n 類(lèi)</p><p> 以CButton 為基類(lèi)創(chuàng)建CSXButton 類(lèi),CSXButton 由CButton 派生而來(lái),用于創(chuàng)建控制的按鈕,用于界面的美化。CSXButton 類(lèi)的定義如下:</p><p> class CSXButton : </p><p> public CButton </p><p><b>
63、 { </b></p><p> // Construction public: CSXButton(); </p><p> // Attributes</p><p><b> private: </b></p><p> // Positioning BOOL m_bUseOffset; &l
64、t;/p><p> CPoint m_pointImage; </p><p> CPoint m_pointText; </p><p> int m_nImageOffsetFromBorder; </p><p> int m_nTextOffsetFromImage; </p><p><b>
65、 // Image</b></p><p> HICON m_hIcon;</p><p> HBITMAP m_hBitmap;</p><p> HBITMAP m_hBitmapDisabled; </p><p> int m_nImageWidth, </p><p> m_nImage
66、Height; </p><p> // Color Tab</p><p> char m_bColorTab; </p><p> COLORREF m_crColorTab; </p><p> // State BOOL m_bDefault;</p><p> UINT m_nOldAction;
67、</p><p> UINT m_nOldState; </p><p> // Operations</p><p><b> public:</b></p><p> // Positioning</p><p> int SetImageOffset( int nPixels );
68、 </p><p> int SetTextOffset( int nPixels ); </p><p> CPoint SetImagePos( CPoint p );</p><p> CPoint SetTextPos( CPoint p );</p><p><b> // Image</b></
69、p><p> BOOL SetIcon( UINT nID, int nWidth, int nHeight );</p><p> BOOL SetBitmap( UINT nID, int nWidth, int nHeight ); </p><p> BOOL SetMaskedBitmap( UINT nID, int nWidth, int nHeig
70、ht, COLORREF crTransparentMask ); BOOL HasImage(); </p><p> // Color Tab </p><p> void SetColorTab(COLORREF crTab);</p><p> // State BOOL SetDefaultButton( BOOL bState = TRUE );
71、</p><p><b> private: </b></p><p> BOOL SetBitmapCommon( UINT nID, int nWidth, int nHeight, COLORREF crTransparentMask, BOOL bUseMask ); </p><p> void CheckPointForCen
72、tering( CPoint &p, int nWidth, int nHeight ); void Redraw();</p><p> // Overrides </p><p> // ClassWizard generated virtual function overrides </p><p> //{{AFX_VIRTUAL(CSXBut
73、ton) </p><p><b> public: </b></p><p> virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); </p><p> //}}AFX_VIRTUAL</p><p> // Implementation</p
74、><p><b> public: </b></p><p> virtual ~CSXButton(); </p><p> // Generated message map functions</p><p> protected:</p><p> //{{AFX_MSG(CSXBut
75、ton) </p><p> afx_msg LRESULT OnGetText(WPARAM wParam, LPARAM lParam); </p><p> //}}AFX_MSG </p><p> DECLARE_MESSAGE_MAP()</p><p><b> }; </b></p>
76、<p><b> 六、功能測(cè)試</b></p><p> 本進(jìn)程管理器實(shí)現(xiàn)了四個(gè)功能,加上調(diào)試形成五大界面,以下是程序調(diào)試后的各功能界面。 </p><p> 1)進(jìn)程管理器界面如圖5 所示:</p><p> 圖5 進(jìn)程管理器界面</p><p> 2)獲取進(jìn)程界面如圖6 所示:</p>
77、;<p><b> 圖6 獲取進(jìn)程界面</b></p><p> 3)啟動(dòng)新進(jìn)程界面如圖7 所示: </p><p> 圖7 啟動(dòng)新進(jìn)程界面</p><p> 4)終止進(jìn)程界面如圖8 所示:</p><p><b> 圖8 終止進(jìn)程界面</b></p><
78、p> 5)退出進(jìn)程界面如圖9 所示:</p><p><b> 圖9 退出進(jìn)程界面</b></p><p> 七、存在的不足與對(duì)策</p><p> 經(jīng)過(guò)三個(gè)星期的課程設(shè)計(jì),終于編成了一個(gè)進(jìn)程管理器,我從一個(gè)從未接觸過(guò)MFC 的新手到現(xiàn)在對(duì) MFC 有了一定程度的了解,在此期間,我上網(wǎng)查閱了相關(guān)的資料,看網(wǎng)上視頻教程和查閱圖書(shū)館的
79、相關(guān)書(shū)籍,并在一些同學(xué)的幫助下,終于完成了這份粗糙的作品。通過(guò)這次課程設(shè)計(jì)中,我學(xué)到了很多關(guān)于MFC 的只是,同時(shí)也對(duì)VC++有了更深的認(rèn)識(shí),并對(duì)編程有了新的看法。當(dāng)然,在此過(guò)程中我也遇到了很多問(wèn)題,有的問(wèn)題經(jīng)過(guò)研究科最終被解決了,有的問(wèn)題卻仍然存在,以下是我做這個(gè)實(shí)驗(yàn)遇到的問(wèn)題,以及一些解決的方法: </p><p> 第一、通過(guò)本次試驗(yàn),在“啟動(dòng)新進(jìn)程”的實(shí)現(xiàn)函數(shù)里調(diào)用了 MultiByteToWideCh
80、ar,表示把多字節(jié)字符轉(zhuǎn)為寬字節(jié)字符,它跟 WideCharToMultiByte()函數(shù)(寬字節(jié)字符轉(zhuǎn)為多字節(jié)字符)極容易混淆,實(shí)際上MultiByteToWideChar 和WideCharToMultiByte 是互逆的過(guò)程,MultiByteToWideChar 是將普通字符串轉(zhuǎn)化為Unicod,而WideCharToMultiByte 正好相反。它們的操作過(guò)程相類(lèi)似,在使用時(shí)首先要申請(qǐng)數(shù)組空間,然后分配響應(yīng)的數(shù)組空間,接著是進(jìn)
81、行字符間的轉(zhuǎn)換了,最后還要釋放所占用的內(nèi)存 。這兩個(gè)函數(shù)的缺點(diǎn)在于無(wú)法動(dòng)態(tài)分 21 配內(nèi)存,在轉(zhuǎn)換很長(zhǎng)的字符串時(shí)可能會(huì)浪費(fèi)較多內(nèi)存空間,優(yōu)點(diǎn)是在不考慮浪費(fèi)空間的情況下轉(zhuǎn)換較短字符串非常方便。</p><p> 第二、在窗體界面美化方面。窗體的美化方法有很多,可以在PushButton 控件中美化,可以在GroupButton 控件中美化,可以在Edit 控件中美化,在Static 控件中美化等等,本系統(tǒng)是在 P
82、ushButton 控件中美化的,自定義一個(gè)基于 Cbutton 的子類(lèi) CSXButton,在 CSXButton 函數(shù)里對(duì)整個(gè)BUTTON 控件進(jìn)行繪制。 此次課程設(shè)計(jì)由于時(shí)間和技術(shù)的問(wèn)題,有很多地方還做得不夠好,存在很多不足,有很地方還需要改進(jìn),在程序的設(shè)計(jì)方面。因?yàn)閷?duì)MFC 和VC++編程不太熟悉,在做設(shè)計(jì)的過(guò)程中遇到了很多問(wèn)題,耗費(fèi)了很多時(shí)間在代碼的修改和調(diào)試上,還有很多界面的設(shè)置不能如愿實(shí)現(xiàn),今后應(yīng)在程序的編寫(xiě)上下苦功,不斷
83、加強(qiáng)自己的編程的能力。</p><p><b> 八、程序源代碼</b></p><p> // ShowAllProcessDlg.cpp : implementation file </p><p><b> // </b></p><p> #include "stdafx.
84、h"</p><p> #include "ShowAllProcess.h"</p><p> #include "ShowAllProcessDlg.h" </p><p> #include "TLHELP32.H"//一定要加如這個(gè)頭文件 </p><p>
85、 #ifdef _DEBUG #define new DEBUG_NEW</p><p> #undef THIS_FILE static char THIS_FILE[] = __FILE__;</p><p><b> #endif </b></p><p> /////////////////////////////////////
86、//////////////////////////////////////// </p><p> // CAboutDlg dialog used for App About class CAboutDlg :</p><p><b> public </b></p><p><b> CDialog </b>&
87、lt;/p><p><b> { </b></p><p><b> public:</b></p><p> CAboutDlg(); </p><p> // Dialog Data </p><p> //{{AFX_DATA(CAboutDlg) </p&
88、gt;<p> enum { IDD = IDD_ABOUTBOX }; </p><p> //}}AFX_DATA </p><p> // ClassWizard generated virtual function overrides </p><p> //{{AFX_VIRTUAL(CAboutDlg) </p>&l
89、t;p> protected: </p><p> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support </p><p> //}}AFX_VIRTUAL </p><p> // Implementation </p><p> protec
90、ted: </p><p> //{{AFX_MSG(CAboutDlg) </p><p> //}}AFX_MSG</p><p> DECLARE_MESSAGE_MAP() </p><p><b> }; </b></p><p> CAboutDlg::CAboutDlg()
91、 : CDialog(CAboutDlg::IDD) </p><p><b> { </b></p><p> //{{AFX_DATA_INIT(CAboutDlg)</p><p> //}}AFX_DATA_INIT</p><p><b> } </b></p>&l
92、t;p> void CAboutDlg::DoDataExchange(CDataExchange* pDX) </p><p><b> { </b></p><p> CDialog::DoDataExchange(pDX); </p><p> //{{AFX_DATA_MAP(CAboutDlg) </p>
93、<p> //}}AFX_DATA_MAP } </p><p> BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) </p><p> //{{AFX_MSG_MAP(CAboutDlg) </p><p> // No message handlers </p><p> //}}AFX_MS
94、G_MAP</p><p> END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// </p><p> // CShowAllProcessDlg dialog</p><p> CShowAllProcessDlg::CS
95、howAllProcessDlg(CWnd* pParent /*=NULL*/)</p><p> : CDialog(CShowAllProcessDlg::IDD, pParent) { </p><p> //{{AFX_DATA_INIT(CShowAllProcessDlg) </p><p> // NOTE: the ClassWizard w
96、ill add member initialization here /</p><p> /}}AFX_DATA_INIT</p><p> // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_START
97、); </p><p><b> } </b></p><p> void CShowAllProcessDlg::DoDataExchange(CDataExchange* pDX) </p><p><b> { </b></p><p> CDialog::DoDataExchange
98、(pDX); </p><p> //{{AFX_DATA_MAP(CShowAllProcessDlg) </p><p> DDX_Control(pDX, IDC_LIST_SHOW, m_showlist);</p><p> DDX_Control(pDX, IDOK, m_show); </p><p> DDX_Cont
99、rol(pDX, IDOK, m_show); </p><p> DDX_Control(pDX, IDCANCEL, m_exit); </p><p> DDX_Control(pDX, IDC_STOP, m_stop); 24 //}}AFX_DATA_MAP</p><p> } BEGIN_MESSAGE_MAP(CShowAllProcessD
100、lg, CDialog) /</p><p> /{{AFX_MSG_MAP(CShowAllProcessDlg)</p><p> ON_WM_SYSCOMMAND()</p><p> ON_WM_PAINT()</p><p> ON_WM_QUERYDRAGICON() </p><p> ON_B
101、N_CLICKED(IDOK, OnGetProcess) </p><p> ON_BN_CLICKED(IDC_STOP, OnStopProcess) </p><p> // ON_BN_CLICKED(IDC_startBUTTON, OnstartBUTTON) </p><p> ON_BN_CLICKED(IDC_onrun, Ononrun)
102、 </p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////////</p><p> // CShowAllProcessDlg message handlers B
103、OOL </p><p> CShowAllProcessDlg::OnInitDialog()</p><p><b> { </b></p><p> CDialog::OnInitDialog();</p><p> m_stop.SetIcon(IDI_ICON_STOP,25,25);</p>
104、;<p> m_exit.SetIcon(IDI_ICON_EXIT,25,25);</p><p> m_show.SetIcon(IDI_ICON_SHOW,25,25); m_showlist.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); m_showlist.InsertColumn(0,"進(jìn)程映像名稱(chēng)&quo
105、t;); </p><p> m_showlist.InsertColumn(1,"進(jìn)程開(kāi)啟的線(xiàn)程數(shù)"); </p><p> m_showlist.InsertColumn(2,"PID"); </p><p> m_showlist.InsertColumn(3,"優(yōu)先級(jí)");</p>
106、<p> for(int i=0;i<4;i++)</p><p> m_showlist.SetColumnWidth(i,120);</p><p> // Add "About..." menu item to system menu. </p><p> // IDM_ABOUTBOX must be in t
107、he system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); </p><p> ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);</p><p> if (pSysMenu != NULL)&l
108、t;/p><p><b> {</b></p><p> CString strAboutMenu;</p><p> StrAboutMENU.LoadString(IDS_ABOUTBOX);</p><p> If(!strAboutMenu.IsEmpty())</p><p><
109、;b> {</b></p><p> pSysMenu->AppendMenu(MF_SEPARATOR);</p><p> pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);</p><p><b> }</b></p>&
110、lt;p><b> }</b></p><p> //Set the icon for this dialog. The framework does this automatically</p><p> // When the application’s main window is not a dialog</p><p>
111、 SetIcon(m_hIcon,TURE); //Set big icon</p><p> SerIcon(m_hIcon,FALSE); // Set small icon</p><p> //TOOD:Add extra initialization here</p><p> Return TURE;//return TURE unless y
112、ou set the focus to a control</p><p><b> }</b></p><p> void CShowALLProcessDlg::OnSysCommand(UINT uID, LPARAM lParam)</p><p><b> {</b></p><p>
113、; If((nID&OxFFF0)=IDM_ABOUTBOX)</p><p><b> {</b></p><p> CAboutDlg dlgAbout;</p><p> dlgAbout.DoModal;</p><p><b> }</b></p><
114、p><b> Else</b></p><p><b> {</b></p><p> CDialog::OnSysCommand(nID,lParam);</p><p><b> }</b></p><p><b> }</b><
115、/p><p> //If you add a minimize button to your dialog, you will need the code below</p><p> //to draw the icon. For MFC applications using the document/view model</p><p> //this is
116、automatically done for you by the framework</p><p> void CShowAllProcessDlg::OnPaint()</p><p><b> {</b></p><p> If(IsIconic)</p><p><b> {</b>
117、;</p><p> CPaintDC dc(this);//device context for painting</p><p> SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);</p><p> //Center icon in client rectangle</p>
118、<p> int cxIcon=GetSystemMetrics(SM_CXICON);</p><p> int cyIcon=GetSystemMetrics(SM_CYICON);</p><p> CRect rect;</p><p> GetClientRect(&rect);</p><p> int
119、 x=(rect.Width()-cxIcon+1)/2;</p><p> int y=(rect.Height()-cyIcon+1)/2;</p><p> //Draw the icon</p><p> dc.DrawIccon(x,y,m_hIcon);</p><p><b> }</b></
120、p><p><b> Else</b></p><p><b> {</b></p><p> CDialog::OnPaint();</p><p><b> }</b></p><p><b> }</b></p&g
121、t;<p> The system call this to obtain the cursor to display while the user drags</p><p> //the minimized window.</p><p> HCURSOR CShowAllProcessDlg::OnQueryDragIcon()</p><p&
122、gt;<b> {</b></p><p> return (HCURSOR) m_hIcon;</p><p><b> }</b></p><p> void CShowAllProcessDlg::OnGetPross()</p><p><b> {</b>&
123、lt;/p><p> //TOOD:And your control notification handler code here</p><p> HANDLE Snapshot;</p><p> Snapshot=CreateToolhehp32napshot(TH32CS_SNAPPROCESS,0);</p><p> //獲得
124、某一時(shí)刻系統(tǒng)的進(jìn)程、堆(heap)、模塊(module)或線(xiàn)程的快照消息</p><p> PROCESSENTRY32 processListStr;</p><p> processListStr.dwSise=sizeof(PRECSSENTRY32);</p><p> BOOL return_value;</p><p>
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)原理課程設(shè)計(jì)---進(jìn)程管理器的模擬實(shí)現(xiàn)
- 設(shè)備管理器java課程設(shè)計(jì)
- 任務(wù)管理器進(jìn)程
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告-linux頁(yè)面換入換出分析、進(jìn)程管理器
- 任務(wù)管理器進(jìn)程表
- 操作系統(tǒng)課程設(shè)計(jì)--windows資源管理器與任務(wù)管理器
- 任務(wù)管理器進(jìn)程05756
- 任務(wù)管理器進(jìn)程詳解
- windows任務(wù)管理器進(jìn)程大全
- 任務(wù)管理器中進(jìn)程詳解
- 識(shí)別任務(wù)管理器中進(jìn)程
- 仿資源管理器的java課程設(shè)計(jì)
- 任務(wù)管理器進(jìn)程詳解05671
- 任務(wù)管理器里的進(jìn)程
- 操作系統(tǒng)課程設(shè)計(jì)---windows系統(tǒng)資源管理器與任務(wù)管理器
- 任務(wù)管理器中的進(jìn)程列表
- 功能較完善的文件管理器java課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---windows系統(tǒng)資源管理器與任務(wù)管理器
- a計(jì)算機(jī)任務(wù)管理器進(jìn)程
- windows任務(wù)管理器各進(jìn)程詳解
評(píng)論
0/150
提交評(píng)論