程序管理在windows
中是乙個比較重要的內容,由於每乙個正在執行的程式(包括windows的後台程式和動態鏈結庫)都對應有各自的程序,通過對程序的
管理可以防止一些非法程式(如特洛伊木馬
程式)的執行,
但是windows的任務管理器(就是按alt+ctrl+del後出現的那個東東)雖然能夠中止程序,不過它的程序列表裡面已經遮蔽了某些與系統
有關的程序,現在有的特洛伊木馬(如冰河)在程式設計時將自己註冊為
系統服務,因此通過windows的任務管理器並不能中止它的程序;而windows的系統資訊工具msinfo32.exe雖然能夠列出系統中所有的程序,但是並不能中止程序,所以也是於事無補。
為此我們可以自己編寫乙個程序管理
軟體,首先,它要能夠列出系統中的所有程序,其次也要能夠中止系統中任意乙個程序(當然有些程序中止後將有可能導致宕機)。
程式設計思路:列出系統程序
一般的方法是通過呼叫一組toolhelp32函式,該組函式存在於kernel32.dll鏈結庫中,它有許多
功能,而列舉系統中的程序只是它眾多功能中的一項。下面是要用到的幾個關於程序的api函式:createtoolhelpsnapshot()、processfirst()、processnext()。不知道是什麼原因,這麼重要的函式
微軟居然並沒有將其錄入到vb的api文字瀏覽器中,因此我們只好手工將其錄入了,下面是宣告:
public declare function createtoolhelpsnapshot lib "kernel32" alias "createtoolhelp32snapshot" (byval lflags as long,byval lprocessid as long) as long
public declare function processfirst lib "kernel32" alias "process32first" (byval hsnapshot as long,uprocess as processentry32) as long
public declare function processnext lib "kernel32" alias "process32next" (byval hsnapshot as long,uprocess as processentry32) as long
此外還需要定義乙個processentry32結構,這個結構中包含有有關系統中程序的某些資訊,同樣在vb中的api文字瀏覽器裡也沒有錄入。
public type processentry32
dwsize as long
cntusage as long
th32processid as long
th32defaultheapid as long
th32moduleid as long
cntthreads as long
th32parentprocessid as long
pcpriclassbase as long
dwflags as long
szexefile as string*max_path
end type
下面是列出系統程序的步驟:
1.用createtoolhelpsnapshot()函式來建立系統中程序資訊的「快照」,該函式返回乙個控制代碼(該控制代碼將在下面的函式中得到應用);
2.用processfirst()函式從以上「快照」中獲取程序,該函式有兩個引數,第乙個是第一步中函式返回的控制代碼,第二個是指向processentry32結構的指標,當系統中還有其它程序時,該函式返回true;
3.用processnext()函式從「快照」中不斷獲取程序,直到它返回false為止;
4.用closehandle()函式關閉第一步中的控制代碼。
關 閉程序也是乙個值得討論的問題,傳統的方法是用getwindow來查詢視窗控制代碼,再利用getwindowtext來獲得視窗的標題,然後利用 sendmessage函式傳送wm_close訊息來關閉該程式。不過這種方法有很大的缺陷:首先是有的視窗是沒有標題欄的,這樣的程式是無法通過該方 法關閉的;其次,這種方法對動態鏈結庫也是無法關閉的。在這裡我們可以充分利用processentry32結構,它裡面有乙個 th32processid成員,通過terminateprocess()函式就可以關閉程序。
下面是程式設計的具體步驟:
1.新建一
工程,在窗體form1中新增乙個listview控制項,二個commandbutton;
2.按如下設定控制項:command1.caption="檢視程序";command2.caption="中止程序";lvw.width=5400
3.在「工程」中選擇「新增模組」,加入上面的函式和結構宣告及以下內容:
public declare function terminateprocess lib "kernel32" (byval hprocess as long,byval uexitcode as long) as long
public declare function openprocess lib "kernel32" (byval dwdesiredaccess as long,byval binherithandle as long,byval dwprocessid as long) as long
public declare function closehandle lib "kernel32" (byval hobject as long) as long
public const th32cs_snapheaplist=&h1
public const th32cs_snapthread=&h4
public const max_path as integer=260
4.新增**:
private sub command1_click()
dim i as long
dim proc as processentry32
dim snap as long
dim exename as string
lvw.listitems.clear 注釋:清空所有內容
snap=create toolhelp snapshot(th32cs-snapall,0) 注釋:獲得程序「快照」的控制代碼
proc.dwsize=len(proc)
theloop=processfirst(snap,proc) 注釋:獲取第乙個程序,並得到其返回值
i=0
exename=proc.szexefile
ret=lvw.listitems.add(,"first" & cstr(i),exename) 注釋:將程序名新增到第一項中
lvw.listitems("first" & cstr(i)).subitems(1)=proc.th32processid 注釋:將程序id新增到第二項中
i=i+1
theloop=processnext(snap,proc)
wend
closehandle snap 注釋:關閉程序「快照」控制代碼
end sub
private sub command2_click()
dim i as long
hand=openprocess(process_terminate,true,clng(lvw.selecteditem.subitems(1))) 注釋:獲取程序控制代碼
terminateprocess hand,0 注釋:關閉程序
call command1_click 注釋:呼叫檢視程序來重新整理程序列表
end sub
private sub form_load()
dim header as columnheader
lvw.view = lvwreport
lvw.columnheaders.clear
set header=lvw.columnheaders.add(,"first","程序",4000) 注釋:設定listview中專案的寬度,讀者也可自行設定
set header=lvw.columnheaders.add(,"second","id",1400)
lvw.refresh
end sub
程式的執行介面如圖所示。
程式在windows98
中文版、vb6.0中文企業版下執行通過。需要說明的是由於windows95/98與winnt
中列出系統程序的windows api函式不同,所以以上程式只能在win95/98中執行,不能在winnt及win2000
下執行。
用VB開發程序管理軟體
程序管理在 windows 中是乙個比較重要的內容,由於每乙個正在執行的程式 包括windows的後台程式和動態鏈結庫 都對應有各自的程序,通過對程序的 管理可以防止一些非法程式 如特洛伊 木馬程式 的執行,但是windows的任務管理器 就是按alt ctrl del後出現的那個東東 雖然能夠中止...
管理軟體開發平台
管理軟體,技術門檻並不高。其突出特點就是 需求不斷,每個企業都不願意和別人一樣。管理軟體,說到本質,還是管理思想的落地。只有保持差異化的管理思想,才能保證差異化的競爭。尤其每個企業面臨的內部外部環境都不相同,面臨的問題,目前的競爭地位,過去的歷史包袱,現在的人的利益平衡,未來的走向,都決定了乙個企業...
用Delphi開發來電顯示管理軟體
1 建立如下form 2 在各按鈕的click事件中,分別寫入如下 procedure tform1.button1click sender tobject begin 埠可直接設定,例如埠為usb,port usb if telecomport1.setupport then memo1.line...