Khi 1 file phần mềm chạy (do yêu cầu người dùng hay do chương trình khác kích hoạt), nó được nạp vào bộ nhớ và trở thành process. Bạn có thể dùng hàm API của Windows có tên là WTSEnumerateProcesses() để thống kê tất cả các process đang chạy trên máy, mỗi process là của file khả thi nào, từ đó quyết định xử lý chúng theo yêu cầu của mình.
Sau đây chúng tôi xin giới thiệu qui trình điển hình để xây dựng ứng dụng VB 6.0 demo việc thống kê tất cả các process đang chạy và hiển thị thông tin về chúng trong một ListVew để người dùng xem:
1. Chạy VB 6.0, tạo Project ứng dụng dạng 'Standard EXE' đơn giản.
2. Chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm vào chọn mục Microsoft Window Common Controls 6.0 rồi Ok để thêm các control trong thư viện này vào ToolBox của Project.
3. Thiết kế Form gồm 1 ListView có tên mặc định là ListView1 như hình 4.
4. Chọn menu View.Code để hiển thị cửa sổ soạn mã nguồn cho form rồi viết code cho nó như sau:
Option
Explicit
'khai báo hằng và kiểu cần dùng
Private
Const
WTS_CURRENT_SERVER_HANDLE = 0&
Private
Type WTS_PROCESS_INFO
SessionID
As
Long
ProcessID
As
Long
pProcessName
As
Long
pUserSid
As
Long
End
Type
'khai báo các hàm API cần dùng
Private
Declare
Function
WTSEnumerateProcesses
Lib
'wtsapi32.dll' Alias 'WTSEnumerateProcessesA' (ByVal hServer As Long, ByVal Reserved As Long, ByVal Version As Long, ByRef ppProcessInfo As Long, ByRef pCount As Long) As Long
Private
Declare
Sub
WTSFreeMemory
Lib
'wtsapi32.dll' (ByVal pMemory As Long)
Private
Declare
Sub
CopyMemory
Lib
'kernel32' Alias 'RtlMoveMemory' (Destination As Any, Source As Any, ByVal Length As Long)
'hàm tìm chuỗi từ địa chỉ bộ nhớ xác định
Private
Function
GetStringFromLP(
ByVal
StrPtr
As
Long
)
As
String
Dim
b
As
Byte
Dim
tempStr
As
String
Dim
bufferStr
As
String
Dim
Done
As
Boolean
Done =
False
Do
'lấy từng byte và xử lý
CopyMemory b,
ByVal
StrPtr, 1
If
b = 0
Then
'kết thúc chuỗi
Done =
True
Else
tempStr = Chr$(b)
bufferStr = bufferStr & tempStr
StrPtr = StrPtr + 1
'tăng pointer tới byte kế
End
If
Loop
Until
Done
GetStringFromLP = bufferStr
End
Function
'thủ tục khởi động Form
Private
Sub
Form_Load()
ListView1.View = lvwReport
'tạo header gồm 4 cột thông tin trên ListView
ListView1.ColumnHeaders.Add 1,
'SessionID', 'Session ID'
ListView1.ColumnHeaders.Add 2,
'ProcessID', 'Process ID'
ListView1.ColumnHeaders.Add 3,
'ProcessName', 'Process Name'
ListView1.ColumnHeaders.Add 4,
'UserID', 'User ID'
'thống kê và hiển thị các process
GetWTSProcesses
End
Sub
'thủ tục thống kê và hiển thị thông tin các process
Private
Sub
GetWTSProcesses()
'khai báo các biến cần dùng
Dim
RetVal
As
Long
Dim
Count
As
Long
Dim
i
As
Integer
Dim
lpBuffer
As
Long
Dim
p
As
Long
Dim
udtProcInfo
As
WTS_PROCESS_INFO
Dim
itmAdd
As
ListItem
'xóa nội dung cũ của ListView
ListView1.ListItems.Clear
'thống kê các process
RetVal = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0&, 1, lpBuffer, Count)
If
RetVal = 0
Then
'nếu thất bại
MsgBox
'Error occurred calling WTSEnumerateProcesses. ' & 'Check the Platform SDK error codes in the MSDN Documentation' & ' for more information.', vbCritical, 'Error ' & Err.LastDllError
'dừng thủ tục
Exit
Sub
End
If
'nếu thống kê được thì lặp hiển thị từng process
p = lpBuffer
For
i = 1
To
Count
'copy thông tin về process i vào biến udtProcInfo
CopyMemory udtProcInfo,
ByVal
p, LenB(udtProcInfo)
'thêm hàng thông tin về process i vào ListView
Set
itmAdd = ListView1.ListItems.Add(i, ,
CStr
(udtProcInfo.SessionID))
itmAdd.SubItems(1) =
CStr
(udtProcInfo.ProcessID)
itmAdd.SubItems(2) = GetStringFromLP(udtProcInfo.pProcessName)
itmAdd.SubItems(3) =
CStr
(udtProcInfo.pUserSid)
'hiệu chỉnh p về vị trí miêu tả process kế tiếp
p = p + LenB(udtProcInfo)
Next
i
Set
itmAdd =
Nothing
'giải phóng bộ nhớ
WTSFreeMemory lpBuffer
End
Sub
Lưu ý tên file khả thi của process được chứa trong trường udtProcInfo.pProcessName.
5. Chọn menu Run.Start để chạy thử Form vừa xây dựng và xem danh sách các process đang chạy trên máy.
Theo pcworld
Nguồn bài viết: thanglong-aptech.com
0 nhận xét:
Đăng nhận xét