青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

road420

導航

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

統計

常用鏈接

留言簿(2)

隨筆檔案

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

如何用 Win32 APIs 枚舉應用程序窗口和進程

如何用 Win32 APIs 枚舉應用程序窗口和進程

編譯:NorthTibet

下載源代碼

摘要

  我們在編寫程序時,常常遇到的一件事情就是要準確列出系統中所有正在運行的程序或者進程。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)。


使用 PSAPI 庫枚舉進程

  在 Windows NT 中,創建進程列表使用 PSAPI 函數,這些函數在 PSAPI.DLL 中。這個文件是隨 Platform SDK 一起分發的,最新版本的 Platform SDK 可以從這里下載

使用這個庫所需的 PSAPI.h 和 PSAPI.lib 文件也在該 Platform SDK 中。
  為了使用 PSAPI 庫中的函數,需將 PSAPI.lib 添加到代碼項目中,同時在所有調用 PSAPI API 的模塊中包含 PSAPI.h 文件。記住一定要隨可執行文件一起分發 PSAPI.DLL,因為它不隨 Windows NT 一起分發。你可以點擊這里單獨下載 PSAPI.DLL 的可分發版本(不用完全下載 Platform SDK)。
  與 ToolHelp32 一樣,PSAPI 庫也包含各種各樣有用的函數。由于篇幅所限,本文只討論與枚舉進程有關函數:EnumProcesses()、 EnumProcessModules()、GetModuleFileNameEx()和 GetModuleBaseName()。
  創建進程列表的第一步是調用 EnumProcesses()。該函數的聲明如下:

BOOL EnumProcesses( DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded );
  EnumProcesses()帶三個參數,DWORD 類型的數組指針 lpidProcess;該數組的大小尺寸 cb;以及一個指向 DWORD 的指針 cbNeeded,它接收返回數據的長度。DWORD 數組用于保存當前運行的進程 IDs。cbNeeded 返回數組所用的內存大小。下面算式可以得出返回了多少進程:nReturned = cbNeeded / sizeof(DWORD)。
  注意:雖然文檔將返回的 DWORD 命名為“cbNeeded”,實際上是沒有辦法知道到底要傳多大的數組的。EnumProcesses()根本不會在 cbNeeded 中返回一個大于 cb 參數傳遞的數組值。結果,唯一確保 EnumProcesses()函數成功的方法是分配一個 DWORD 數組,并且,如果返回的 cbNeeded 等于 cb,分配一個較大的數組,并不停地嘗試直到 cbNeeded 小于 cb
  現在,你獲得了一個數組,其元素保存著系統中每個進程的ID。如果你要想獲取進程名,那么你必須首先獲取一個句柄。要想從進程 ID 得到句柄,就得調用 OpenProcess()。
  一旦有了句柄,則需要得到該進程的第一個模塊。為此調用 EnumProcessModules() API:
EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned );
  調用之后,hModule 變量中保存的將是進程中的第一個模塊。記住進程其實沒有名字,但進程的第一個模塊既是該進程的可執行模塊?,F在你可以用 hModule 中返回的模塊句柄調用 GetModuleFileNameEx() 或 GetModuleBaseName() API 函數獲取全路徑名,或者僅僅是進程可執行模塊名。兩個函數均帶四個參數:進程句柄,模塊句柄,返回名字的緩沖指針以及緩沖大小尺寸。
  用 EnumProcesses() API 返回的每一個進程 ID 重復這個調用過程,你便可以創建 Windows NT 的進程列表。


16位進程的處理方法

  在 Windows 95,Windows 98 和 Windows ME 中,ToolHelp32 對待16位程序一視同仁,它們與 Win32 程序一樣有自己的進程IDs。但是在 Windows NT,Windows 2000 或 Windows XP 中情況并不是這樣。在這些操作系統中,16位程序運行在所謂的 VDM 當中(也就是DOS機)。
  為了在 Windows NT,Windows 2000 和 Windows XP 中枚舉16位程序,你必須使用一個名為 VDMEnumTaskWOWEx()的函數。在源代碼模塊中必須包含 VDMDBG.h,并且 VDMDBG.lib 文件必須與項目鏈接。這兩個文件都在 Platform SDK 中。該函數的聲明如下:
INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,LPARAM lparam );

  此處 dwProcessId 是 NTVDM 中擬枚舉的16位任務進程標示符。參數 fp 是回調枚舉函數的指針。參數 lparam 是用戶定義的值,它被傳遞到枚舉函數。枚舉函數應該被定義成如下這樣:

BOOL WINAPI Enum16( DWORD dwThreadId, 
WORD hMod16,
WORD hTask16,
PSZ pszModName,
PSZ pszFileName,
LPARAM lpUserDefined );
  該函數針對每個運行在 NTVDM 進程中的16位任務調用一次,NTVDM 進程ID將被傳入 VDMEnumTaskWOWEx()。如果想繼續枚舉則返回 FALSE,終止枚舉則返回 TRUE。注意這是與 EnumWindows()相對的。


關于代碼

  本文附帶的代碼例子將 PSAPI 和 ToolHelp32 封裝到一個名為 EnumProcs() 的函數中。該函數的工作原理類似 EnumWindows(),有一個指向回調函數的指針,并要對該函數進行重復調用,針對系統中的每個進程調用一次。另一個參數是用戶定義的 lParam。下面是該函數的聲明:
BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam );

使用該函數時,要象下面這樣聲明回調函數:

BOOL CALLBACK Proc( DWORD dw, WORD w16, LPCSTR lpstr, LPARAM lParam );
  參數 dw 包含 ID,“w16”是16位任務的任務號,如果為32位進程則為0(在 Windows 95 中總是0),參數lpstr 指向文件名,lParam 是用戶定義的,要被傳入 EnumProcs()。
  EnumProcs() 函數通過顯示鏈接使用 ToolHelp32 和 PSAPI,而非通常所用的隱式鏈接。之所以要這樣做,主要是為了讓代碼能夠在二進制一級兼容,從可以在所有 Win32 操作系統平臺上運行。

posted on 2008-09-22 18:34 深邃者 閱讀(235) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区在线播放| 免费久久99精品国产自| 亚洲网站视频福利| 黑人一区二区| 国产毛片一区| 国产一区二区三区在线免费观看| 国产欧美日本| 国产欧美日韩另类一区| 国产精品入口日韩视频大尺度| 欧美日韩一级大片网址| 国产日韩欧美视频| 在线观看日产精品| 亚洲全部视频| 久久久噜噜噜久久中文字免| 理论片一区二区在线| 亚洲精选在线| 亚洲永久字幕| 欧美国产视频日韩| 国产精品国产| 91久久国产自产拍夜夜嗨| 一区二区三区高清| 久久久久国色av免费看影院 | 久久婷婷蜜乳一本欲蜜臀| 久久网站免费| 国产欧美日韩中文字幕在线| 欧美精品在线免费播放| 欧美另类69精品久久久久9999| 国产老女人精品毛片久久| 亚洲乱码日产精品bd| 亚洲三级视频| 欧美一区二区三区在线观看视频 | 国产精品区免费视频| 亚洲二区视频在线| 久久久综合激的五月天| 国产精品99久久久久久久女警| 欧美成人69| 99精品国产热久久91蜜凸| 美女福利精品视频| 亚洲一区免费看| 国产精品美女视频网站| 亚洲欧美日产图| 亚洲视频免费在线观看| 国产精品免费网站在线观看| 欧美中文在线观看| 亚洲欧美久久久| 黄色一区二区三区| 欧美大尺度在线| 欧美丰满高潮xxxx喷水动漫| 1769国产精品| 夜夜嗨一区二区三区| 国产精品丝袜久久久久久app| 亚洲香蕉在线观看| 午夜一区在线| 日韩视频在线一区| 亚洲色诱最新| 亚洲精品在线视频| 亚洲欧美日韩成人| 亚洲国产精品第一区二区三区 | 亚洲免费观看| 亚洲一区图片| 中国成人黄色视屏| 久久久高清一区二区三区| 亚洲一区在线免费观看| 噜噜噜久久亚洲精品国产品小说| 快she精品国产999| 一区二区三区高清不卡| 久久精品水蜜桃av综合天堂| 亚洲综合成人婷婷小说| 免费不卡在线观看av| 久久综合给合久久狠狠狠97色69| 国产精品高精视频免费| 一区二区三区精品在线| 亚洲视频精选在线| 国产精品成人一区二区| 99av国产精品欲麻豆| 亚洲五月婷婷| 欧美午夜不卡影院在线观看完整版免费| 美玉足脚交一区二区三区图片| 国模套图日韩精品一区二区| 亚洲视频一区二区免费在线观看| 亚洲精品欧美日韩专区| 欧美日韩三区四区| 亚洲一二三区精品| 午夜一级在线看亚洲| 国产最新精品精品你懂的| 久久久久久日产精品| 欧美韩日高清| 亚洲在线一区二区| 国语自产精品视频在线看抢先版结局 | 欧美亚洲日本网站| 激情91久久| 国产精品va在线播放我和闺蜜| 日韩视频免费大全中文字幕| 欧美在线一二三区| 久久先锋影音av| 亚洲美女区一区| 欧美成人综合一区| 久久久人人人| 午夜欧美大尺度福利影院在线看| 亚洲第一精品电影| 国产欧美精品日韩精品| 美女主播视频一区| 性色av一区二区三区| 夜夜嗨av一区二区三区网页| 欧美成人精品一区| 久久亚洲精选| 久久久久欧美精品| 欧美专区中文字幕| 欧美一区亚洲二区| 亚洲欧美日韩天堂一区二区| 日韩亚洲欧美一区| 日韩亚洲在线| 亚洲天堂男人| 亚洲专区一二三| 午夜久久电影网| 欧美一区二区成人6969| 欧美专区18| 免费不卡中文字幕视频| 免费观看不卡av| 亚洲国产色一区| 久热精品在线视频| 亚洲欧美日本国产专区一区| 亚洲视频在线观看网站| 午夜亚洲福利在线老司机| 欧美在线一二三四区| 欧美v日韩v国产v| 亚洲美女免费精品视频在线观看| 一区二区欧美在线观看| 香蕉乱码成人久久天堂爱免费 | 亚洲视频第一页| 亚洲一区网站| 欧美精品一区二区三区很污很色的| 国产精品色婷婷| 久久久免费观看视频| 久久激五月天综合精品| 99re这里只有精品6| 校园激情久久| 欧美午夜欧美| 亚洲人成亚洲人成在线观看图片| 新67194成人永久网站| 久久婷婷综合激情| 欧美性猛交xxxx免费看久久久| 国精品一区二区三区| 亚洲免费小视频| 亚洲美洲欧洲综合国产一区| 美女视频黄 久久| 一区二区三区在线视频播放 | 久久婷婷国产综合精品青草| 国产精品国产三级国产普通话三级 | 久久精品国产77777蜜臀| 国产精品乱人伦中文| 欧美一级淫片播放口| 国产亚洲欧美日韩日本| 亚洲国产精品成人综合| 亚洲夜间福利| 亚洲在线电影| 国产精品盗摄久久久| 亚洲国产合集| 欧美福利一区二区三区| 久久香蕉国产线看观看av| 激情欧美丁香| 免费成人网www| 蜜桃视频一区| 亚洲视频电影图片偷拍一区| 一区二区三区久久| 国产日韩精品久久久| 久久精品国产精品亚洲综合| 欧美一级理论性理论a| 亚洲人成人77777线观看| 亚洲午夜激情网站| 亚洲最黄网站| 亚洲在线视频一区| 亚洲综合成人在线| 亚洲手机视频| 亚洲一区在线观看免费观看电影高清| 久久影院午夜论| 亚洲国产精品久久久| 免费看成人av| 亚洲精品乱码久久久久久蜜桃91| 在线观看日韩av先锋影音电影院| 欧美成人精品不卡视频在线观看| 亚洲免费成人av| 亚洲影视综合| 激情欧美日韩| 欧美日韩另类在线| 欧美一区二区三区视频免费| 麻豆国产va免费精品高清在线| 99精品欧美一区二区三区综合在线| 国产精品久久久一本精品| 久久精品在线视频| 亚洲性夜色噜噜噜7777| 亚洲国产精品久久| 久久在线免费视频| 亚洲一级高清| 99国产精品视频免费观看| 国内激情久久| 欧美国产综合| 久久综合久久综合久久综合| 中日韩高清电影网| 亚洲欧洲日本国产|