如何用Win32 APIs枚舉應用程式視窗和進程

來源:互聯網
上載者:User

摘要

我們在編寫程式時,常常遇到的一件事情就是要準確列出系統中所有正在啟動並執行程式或者進程。Windows 工作管理員就是這樣的一個程式。它既能列出啟動並執行傳統型應用程式,又能列出系統中所有啟動並執行進程。那麼,我們在程式中如何?這樣的任務呢?本文下面將詳細討論這個問題。

枚舉頂層(top-level)視窗

枚舉案頭頂層視窗相對於枚舉進程來說可能要容易一些。枚舉案頭頂層視窗的方法是用 EnumWindows() 函數。不要用 GetWindow()來建立視窗列表,因為視窗之間複雜的父子及同胞關係(Z-Order)容易造成混亂而使得枚舉結果不準確。

EnumWindows()有兩個參數,一個是指向回呼函數的指標,一個是使用者定義的 LPARAM 值, 針對每個桌面視窗(或者頂層視窗)它調用回呼函數一次。然後回呼函數用該視窗控制代碼做一些處理,比如將它添加到列表中。這個方法保證枚舉結果不會被視窗複雜的層次關係搞亂,因此,一旦有了視窗控制代碼,我們就可以通過 GetWindowText() 得到視窗標題。

枚舉進程

建立系統進程列表比枚舉視窗稍微複雜一些。這主要是因為所用的 API 函數對於不同的 Win32 作業系統有依賴性。在 Windows 9x、Windows Me、Windows 2000 Professional 以及 Windows XP 中,我們可以用 ToolHelp32 庫中的 APIs 函數。但是在 Windows NT 裡,我們必須用 PSAPI 庫中的 APIs 函數, PSAPI 庫是 SDK 的一部分。本文我們將討論上述所有平台中的實現。附帶的例子程式將對上述庫中的 APIs 進行封裝,以便封裝後的函數能支援所有 Win32 作業系統。

使用 ToolHelp32 庫枚舉進程

ToolHelp32 庫函數在 KERNEL32.dll 中,它們都是標準的 API 函數。但是 Windows NT 4.0 不提供這些函。

ToolHelp32 庫中有各種各樣的函數可以用來枚舉系統中的進程、線程以及擷取記憶體和模組資訊。其中枚舉進程 只需用如下三個的函數:CreateToolhelp32Snapshot()、Process32First()和 Process32Next()。

使用 ToolHelp32 函數的第一步是用 CreateToolhelp32Snapshot() 函數建立系統資訊“快照”。這個函數可以讓你選擇儲存在快照中的資訊類型。如果你只是對進程資訊感興趣,那麼只要包含 TH32CS_SNAPPROCESS 標誌即可。 CreateToolhelp32Snapshot() 函數返回一個 HANDLE,完成調用之後,必須將此 HANDLE 傳給 CloseHandle()。

接下來是調用一次 Process32First 函數,從快照中擷取進程列表,然後重複調用 Process32Next,直到函數返回 FALSE 為止。這樣將遍曆快照中進程列表。這兩個函數都帶兩個參數,它們分別是快照控制代碼和一個  PROCESSENTRY32 結構。

調用完 Process32First 或 Process32Next 之後,PROCESSENTRY32 中將包含系統中某個進程的關鍵資訊。其中進程 ID 就儲存在此結構的 th32ProcessID。此 ID 可以被傳給 OpenProcess() API 以獲得該進程的控制代碼。對應的可執行檔名及其存放路徑存放在 szExeFile 結構成員中。在該結構中還可以找到其它一些有用的資訊。

注意:在調用 Process32First() 之前,一定要記住將 PROCESSENTRY32 結構的 dwSize 成員設定成 sizeof(PROCESSENTRY32)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.