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

road420

導(dǎo)航

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

統(tǒng)計(jì)

常用鏈接

留言簿(2)

隨筆檔案

文章檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

如何用 Win32 APIs 枚舉應(yīng)用程序窗口和進(jìn)程

如何用 Win32 APIs 枚舉應(yīng)用程序窗口和進(jìn)程

編譯:NorthTibet

下載源代碼

摘要

  我們?cè)诰帉懗绦驎r(shí),常常遇到的一件事情就是要準(zhǔn)確列出系統(tǒng)中所有正在運(yùn)行的程序或者進(jìn)程。Windows 任務(wù)管理器就是這樣的一個(gè)程序。它既能列出運(yùn)行的桌面應(yīng)用程序,又能列出系統(tǒng)中所有運(yùn)行的進(jìn)程。那么,我們?cè)诔绦蛑腥绾螌?shí)現(xiàn)這樣的任務(wù)呢?本文下面將詳細(xì)討論這個(gè)問題。


枚舉頂層(top-level)窗口

  枚舉桌面頂層窗口相對(duì)于枚舉進(jìn)程來說可能要容易一些。枚舉桌面頂層窗口的方法是用 EnumWindows() 函數(shù)。不要用 GetWindow()來創(chuàng)建窗口列表,因?yàn)榇翱谥g復(fù)雜的父子及同胞關(guān)系(Z-Order)容易造成混亂而使得枚舉結(jié)果不準(zhǔn)確。
  EnumWindows()有兩個(gè)參數(shù),一個(gè)是指向回調(diào)函數(shù)的指針,一個(gè)是用戶定義的 LPARAM 值, 針對(duì)每個(gè)桌面窗口(或者頂層窗口)它調(diào)用回調(diào)函數(shù)一次。然后回調(diào)函數(shù)用該窗口句柄做一些處理,比如將它添加到列表中。這個(gè)方法保證枚舉結(jié)果不會(huì)被窗口復(fù)雜的層次關(guān)系搞亂,因此,一旦有了窗口句柄,我們就可以通過 GetWindowText() 得到窗口標(biāo)題。


枚舉進(jìn)程

  建立系統(tǒng)進(jìn)程列表比枚舉窗口稍微復(fù)雜一些。這主要是因?yàn)樗玫?API 函數(shù)對(duì)于不同的 Win32 操作系統(tǒng)有依賴性。在 Windows 9x、Windows Me、Windows 2000 Professional 以及 Windows XP 中,我們可以用 ToolHelp32 庫(kù)中的 APIs 函數(shù)。但是在 Windows NT 里,我們必須用 PSAPI 庫(kù)中的 APIs 函數(shù), PSAPI 庫(kù)是 SDK 的一部分。本文我們將討論上述所有平臺(tái)中的實(shí)現(xiàn)。附帶的例子程序?qū)?duì)上述庫(kù)中的 APIs 進(jìn)行包裝,以便包裝后的函數(shù)能支持所有 Win32 操作系統(tǒng)。


使用 ToolHelp32 庫(kù)枚舉進(jìn)程

  ToolHelp32 庫(kù)函數(shù)在 KERNEL32.dll 中,它們都是標(biāo)準(zhǔn)的 API 函數(shù)。但是 Windows NT 4.0 不提供這些函。
  ToolHelp32 庫(kù)中有各種各樣的函數(shù)可以用來枚舉系統(tǒng)中的進(jìn)程、線程以及獲取內(nèi)存和模塊信息。其中枚舉進(jìn)程 只需用如下三個(gè)的函數(shù):CreateToolhelp32Snapshot()、Process32First()和 Process32Next()。
  使用 ToolHelp32 函數(shù)的第一步是用 CreateToolhelp32Snapshot() 函數(shù)創(chuàng)建系統(tǒng)信息“快照”。這個(gè)函數(shù)可以讓你選擇存儲(chǔ)在快照中的信息類型。如果你只是對(duì)進(jìn)程信息感興趣,那么只要包含 TH32CS_SNAPPROCESS 標(biāo)志即可。 CreateToolhelp32Snapshot() 函數(shù)返回一個(gè) HANDLE,完成調(diào)用之后,必須將此 HANDLE 傳給 CloseHandle()。
  接下來是調(diào)用一次 Process32First 函數(shù),從快照中獲取進(jìn)程列表,然后重復(fù)調(diào)用 Process32Next,直到函數(shù)返回 FALSE 為止。這樣將遍歷快照中進(jìn)程列表。這兩個(gè)函數(shù)都帶兩個(gè)參數(shù),它們分別是快照句柄和一個(gè)   PROCESSENTRY32 結(jié)構(gòu)。
  調(diào)用完 Process32First 或 Process32Next 之后,PROCESSENTRY32 中將包含系統(tǒng)中某個(gè)進(jìn)程的關(guān)鍵信息。其中進(jìn)程 ID 就存儲(chǔ)在此結(jié)構(gòu)的 th32ProcessID。此 ID 可以被傳給 OpenProcess() API 以獲得該進(jìn)程的句柄。對(duì)應(yīng)的可執(zhí)行文件名及其存放路徑存放在 szExeFile  結(jié)構(gòu)成員中。在該結(jié)構(gòu)中還可以找到其它一些有用的信息。
  注意:在調(diào)用 Process32First() 之前,一定要記住將 PROCESSENTRY32  結(jié)構(gòu)的 dwSize 成員設(shè)置成 sizeof(PROCESSENTRY32)。


使用 PSAPI 庫(kù)枚舉進(jìn)程

  在 Windows NT 中,創(chuàng)建進(jìn)程列表使用 PSAPI 函數(shù),這些函數(shù)在 PSAPI.DLL 中。這個(gè)文件是隨 Platform SDK 一起分發(fā)的,最新版本的 Platform SDK 可以從這里下載

使用這個(gè)庫(kù)所需的 PSAPI.h 和 PSAPI.lib 文件也在該 Platform SDK 中。
  為了使用 PSAPI 庫(kù)中的函數(shù),需將 PSAPI.lib 添加到代碼項(xiàng)目中,同時(shí)在所有調(diào)用 PSAPI API 的模塊中包含 PSAPI.h 文件。記住一定要隨可執(zhí)行文件一起分發(fā) PSAPI.DLL,因?yàn)樗浑S Windows NT 一起分發(fā)。你可以點(diǎn)擊這里單獨(dú)下載 PSAPI.DLL 的可分發(fā)版本(不用完全下載 Platform SDK)。
  與 ToolHelp32 一樣,PSAPI 庫(kù)也包含各種各樣有用的函數(shù)。由于篇幅所限,本文只討論與枚舉進(jìn)程有關(guān)函數(shù):EnumProcesses()、 EnumProcessModules()、GetModuleFileNameEx()和 GetModuleBaseName()。
  創(chuàng)建進(jìn)程列表的第一步是調(diào)用 EnumProcesses()。該函數(shù)的聲明如下:

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


16位進(jìn)程的處理方法

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

  此處 dwProcessId 是 NTVDM 中擬枚舉的16位任務(wù)進(jìn)程標(biāo)示符。參數(shù) fp 是回調(diào)枚舉函數(shù)的指針。參數(shù) lparam 是用戶定義的值,它被傳遞到枚舉函數(shù)。枚舉函數(shù)應(yīng)該被定義成如下這樣:

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


關(guān)于代碼

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

使用該函數(shù)時(shí),要象下面這樣聲明回調(diào)函數(shù):

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

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


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区免费观看视频| 狠狠狠色丁香婷婷综合激情| 亚洲在线日韩| 欧美成人伊人久久综合网| 久久久久久久久久码影片| 亚洲欧美激情视频| 午夜精品美女自拍福到在线| 性欧美大战久久久久久久久| 欧美在线视频日韩| 蜜桃精品久久久久久久免费影院| 男女激情视频一区| 亚洲啪啪91| 亚洲精品久久久久久久久久久久久 | 欧美女同视频| 国产精品高清在线观看| 国产精品美女久久| 一区二区在线观看视频在线观看| 亚洲欧洲综合| 亚洲欧美乱综合| 欧美成黄导航| 亚洲视频一二| 可以看av的网站久久看| 欧美精品日本| 国产精品中文字幕在线观看| 亚洲黄一区二区三区| 亚洲一级黄色av| 蜜桃av综合| 亚洲一区综合| 欧美久久久久久| 在线播放亚洲一区| 亚洲尤物精选| 亚洲国产精品成人久久综合一区| 亚洲视频一二区| 欧美片在线播放| 激情丁香综合| 久久er99精品| 亚洲日本一区二区| 久久在线精品| 国内精品久久久久久| 亚洲一区二区三区在线观看视频| 欧美激情91| 久久99伊人| 国产精品视频网址| 在线观看亚洲| 久久免费一区| 亚洲永久字幕| 欧美另类高清视频在线| 亚洲国产精品一区二区第四页av| 亚洲午夜激情网站| 欧美激情1区| 久久久久国产精品人| 国产精品久久久久免费a∨大胸| 亚洲激情在线播放| 欧美国产精品中文字幕| 久久免费视频一区| 一区二区在线视频| 久久精品视频va| 久久国产欧美日韩精品| 国产精品美女一区二区在线观看| 妖精成人www高清在线观看| 亚洲第一福利社区| 欧美激情精品久久久六区热门| 国产精品人人做人人爽人人添| 日韩视频在线一区二区三区| 欧美福利一区二区| 女主播福利一区| 亚洲久久成人| 亚洲另类在线一区| 国产精品视频一二三| 久久久噜噜噜久久| 可以看av的网站久久看| 亚洲精品少妇| 亚洲视频在线一区| 好男人免费精品视频| 麻豆精品视频在线观看视频| 欧美成ee人免费视频| 亚洲一区二区动漫| 欧美在线视屏| 最近中文字幕日韩精品| 亚洲高清一区二区三区| 亚洲黄色在线看| 国产精品美女一区二区| 欧美国产精品va在线观看| 亚洲高清av在线| 亚洲国产欧美国产综合一区| 欧美日韩激情网| 亚洲一本视频| 午夜精品久久久久久久99樱桃| 欧美午夜一区二区福利视频| 午夜一级久久| 欧美一区二区免费观在线| 亚洲激情婷婷| 亚洲综合视频1区| 国产精品av久久久久久麻豆网| 欧美一区二区三区久久精品茉莉花| 亚洲中字黄色| 在线成人激情| 亚洲视频在线一区| 在线观看的日韩av| av不卡在线看| 在线播放中文一区| 一区二区三区免费观看| 影院欧美亚洲| 久久久精品午夜少妇| 国产视频在线观看一区二区| 欧美成年视频| 国产美女精品免费电影| 亚洲大胆av| 国产欧美日韩一区| 亚洲国产合集| 国产一区二区三区观看 | 一区在线影院| 亚洲欧洲一区二区天堂久久| 欧美日韩中文字幕在线视频| 久久久久国产一区二区三区| 欧美午夜精品久久久久久浪潮| 久久久国产精品一区| 欧美性色aⅴ视频一区日韩精品| 久久久水蜜桃| 国产女人18毛片水18精品| 日韩视频在线你懂得| 亚洲精品国产精品国产自| 久久精品91| 久久精品国产欧美激情| 国产女优一区| 午夜宅男久久久| 久久国产精彩视频| 国产日韩欧美视频| 亚洲视屏一区| 午夜老司机精品| 国产精品午夜在线| 亚洲欧美国产va在线影院| 亚洲一区在线播放| 欧美三级视频| 亚洲久色影视| 亚洲性视频网站| 国产精品永久免费| 亚洲欧美综合精品久久成人| 性欧美xxxx大乳国产app| 欧美日韩视频免费播放| 99精品国产热久久91蜜凸| 亚洲网站在线播放| 欧美视频免费在线| 亚洲看片一区| 99一区二区| 欧美日韩在线免费观看| 亚洲午夜电影在线观看| 欧美亚洲一区二区在线| 国产一区二区丝袜高跟鞋图片| 亚洲一区二区视频| 中文精品在线| 国产精品地址| 小黄鸭视频精品导航| 久久久久一区二区三区| 最新高清无码专区| 欧美色综合天天久久综合精品| 亚洲一级片在线观看| 久久人人97超碰国产公开结果| 激情欧美一区| 老司机精品视频网站| 亚洲国产日韩欧美| 夜夜嗨av一区二区三区四区 | 在线视频亚洲欧美| 午夜在线精品偷拍| 欧美日韩在线大尺度| 午夜精品在线看| 免费高清在线一区| 在线视频亚洲| 久久久久国色av免费看影院| 欧美日韩中文| 亚洲一区二区三区精品动漫| 久久理论片午夜琪琪电影网| 亚洲美女在线一区| 国产色综合久久| 免费观看成人| 亚洲免费综合| 亚洲精品一区二区三区婷婷月 | 国产精品午夜电影| 亚洲毛片一区二区| 中文欧美日韩| 韩日精品中文字幕| 欧美日韩亚洲一区二区三区在线观看 | 亚洲欧美一区二区激情| 久久都是精品| 国产精品99久久久久久有的能看 | 久久精精品视频| 99综合视频| 你懂的亚洲视频| 亚洲欧美日韩一区二区三区在线观看| 国内精品久久久久影院色| 免费欧美在线| 久久九九久久九九| 午夜在线观看欧美| 日韩亚洲欧美精品| 亚洲第一在线| 欧美va天堂在线| 欧美一区91| 亚洲丝袜av一区| 亚洲精品在线一区二区| 原创国产精品91|