Trang 1 trên 1

Tìm hWnd và Tiêu đề cửa sổ của Process

Đã gửi: T.Sáu 14/08/2009 3:30 pm
gửi bởi truongphu
Thủ thuật: Tìm hWnd và Tiêu đề cửa sổ của Process
Tác giả: truongphu
Mô tả: Tìm hWnd của Process. (Chẳng biết bài tương tự có chưa? nhưng thấy có câu hỏi "Lấy tiêu đề các process đang hoạt động" ...)


* Phần VBS tìm Process ID
* Phần VB6 tìm hWnd

Mã: Chọn hết

  1. Option Explicit
  2.  
  3. Public strCache As String
  4. Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
  5. Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
  6. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  7. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long
  8. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  9. (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  10. Const WM_GETTEXTLENGTH = &HE:  Const WM_GETTEXT = &HD: Const GW_HWNDNEXT = 2
  11.  
  12. Private Sub Command1_Click()
  13.     GetIPProcess
  14. End Sub
  15.  
  16. Private Sub GetIPProcess() ' VBScript tìm Process ID
  17. Dim objProcess, objProcesses
  18. Set objProcesses = GetObject("winmgmts://").execquery("Select * from win32_process")
  19. ' truongphu, camlâm, khanhhoa
  20.     For Each objProcess In objProcesses
  21.         If UCase(objProcess.Name) = Text1.Text Then strCache = objProcess.Handle
  22.     Next
  23.  
  24. If strCache = "" Then
  25.     MsgBox "Không Tìm Thâ'y."
  26. Else
  27.     FindhWnd
  28. End If
  29.  
  30. End Sub
  31.  
  32. Private Sub FindhWnd()
  33. Dim hProcess As Long, hWndApp As Long
  34.     hProcess = CLng(strCache)
  35.     hWndApp = GetWinHandle(hProcess)
  36. If hWndApp <> 0 Then MsgBox "hWnd là: " & hWndApp & " Tiêu Ðê' là: " & WinGetText(hWndApp)
  37. End Sub
  38.  
  39. Function ProcIDFromWnd(ByVal hwnd As Long) As Long
  40. Dim idProc As Long
  41.     GetWindowThreadProcessId hwnd, idProc
  42.     ProcIDFromWnd = idProc
  43. End Function
  44.  
  45. Function GetWinHandle(hProcess As Long) As Long
  46. Dim tempHwnd As Long
  47. tempHwnd = FindWindow(vbNullString, vbNullString)
  48.  
  49.     Do Until tempHwnd = 0
  50.         If GetParent(tempHwnd) = 0 And (hProcess = ProcIDFromWnd(tempHwnd)) Then
  51.                 GetWinHandle = tempHwnd
  52.                 Exit Do
  53.         End If
  54.         tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)
  55.     Loop
  56. End Function
  57.  
  58. Function WinGetText(hwnd As Long) As String
  59. On Error Resume Next
  60.     Dim length&, result&, strtmp$, S As Variant
  61.     length& = SendMessage(hwnd, WM_GETTEXTLENGTH, ByVal 0, ByVal 0) + 1
  62.     strtmp$ = Space$(length)
  63.     result& = SendMessage(hwnd, WM_GETTEXT, ByVal length, ByVal strtmp)
  64.     S = Split(strtmp, vbNullChar)
  65.     WinGetText$ = S(0)
  66. End Function
  67.  
  68. Private Sub Form_Load()
  69. Text1.Text = "NOTEPAD.EXE"
  70. Shell "Notepad"
  71. End Sub
  72.  

Re: Tìm hWnd và Tiêu đề cửa sổ của Process

Đã gửi: T.Bảy 15/08/2009 1:24 pm
gửi bởi b0y.h4ck3r
nếu có 2 process trùng tên thì nó lấy cái nào hả bác ?

Re: Tìm hWnd và Tiêu đề cửa sổ của Process

Đã gửi: T.Bảy 15/08/2009 2:23 pm
gửi bởi truongphu
b0y.h4ck3r đã viết:nếu có 2 process trùng tên thì nó lấy cái nào


Nó sẽ lấy process mới chạy
Tắt Process mới chạy, đương nhiên nó sẽ lấy process đầu tiên
Bạn thực nghiệm sẽ thấy ngay, ví dụ gọi FRECELL, gọi New game (F2)

Re: Tìm hWnd và Tiêu đề cửa sổ của Process

Đã gửi: T.Bảy 15/08/2009 4:34 pm
gửi bởi truongphu
Code sau đây cho phép lấy hết các process

* bỏ dòng 3: Public strCache As String
* thế 2 sub sau:

Mã: Chọn hết

  1. Private Sub GetIPProcess() ' VBScript tìm Process ID
  2. Dim objProcess, objProcesses, b As Boolean, strCache() As String
  3. Set objProcesses = GetObject("winmgmts://").execquery("Select * from win32_process")
  4. ' truongphu, camlâm, khanhhoa
  5.     For Each objProcess In objProcesses
  6.         If UCase(objProcess.Name) = Text1.Text Then
  7.             Dim x As Byte: If b = False Then x = 0 Else x = UBound(strCache)
  8.             ReDim Preserve strCache(x + 1)
  9.             strCache(x) = objProcess.Handle
  10.             b = True
  11.         End If
  12.     Next
  13.  
  14. If b = False Then
  15.     MsgBox "Không Tìm Thâ'y."
  16. Else
  17.     For x = 0 To UBound(strCache) - 1
  18.         FindhWnd (strCache(x))
  19.     Next
  20. End If
  21.  
  22. End Sub
  23.  
  24. Private Sub FindhWnd(h As String)
  25. Dim hProcess As Long, hWndApp As Long
  26.     hProcess = CLng(h)
  27.     hWndApp = GetWinHandle(hProcess)
  28. If hWndApp <> 0 Then MsgBox "hWnd là: " & hWndApp & " Tiêu Ðê' là: " & WinGetText(hWndApp)
  29. End Sub

Re: Tìm hWnd và Tiêu đề cửa sổ của Process

Đã gửi: T.Hai 23/11/2009 3:09 pm
gửi bởi tai_computer
Thanks bác Phú nha :)

Chúc bác vui ve !