• Thứ Ba, 01/12/2009 10:22 (GMT+7)

    Lấy tên chương trình đang chạy trong máy tính bằng VB

    Câu hỏi :
    Xin hướng dẫn lập trình Visual Basic để lấy tên những tập tin chương trình đang chạy trên máy tính.

    Trả lời :
    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.
     
    Chuyên mục: Lập trình