powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Установить хук на указанное приложение
6 сообщений из 6, страница 1 из 1
Установить хук на указанное приложение
    #39961128
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Написал программу, которая устанавливает хук на своё приложение. Теперь хочу по аналогии сделать установку хука на другое приложение. Всё, что необходимо для начала - это отслеживать изменение размера окна, свёрнуто оно или развёрнуто, не ушёл ли с него фокус.

Попытался через CreateProcess сделать, но ничего не вышло.
Вообще, необходимо любое приложение "хукать" (не только через CreateProcess), hWnd приложений все известны, как получить их hInstance и ThreadID я не знаю.


Вопрос, как корректно вызвать эту функцию?
Код: vbnet
1.
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf Hook_Func, proc_info.dwProcessID, proc_info.dwThreadId)



Если написать так, то всё работает идеально, только в рамках моего приложения, а мне нужно на чужое приложение поставить:
Код: vbnet
1.
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf Hook_Func, App.hInstance, App.ThreadID)



Подскажите, пожалуйста, в чём ошибка у меня?

Модуль:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
Option Explicit

Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal cb As Long)
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal iCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long


Public Const WH_CALLWNDPROC = 4
Public Const WM_COMMAND = &H111
Public Const NORMAL_PRIORITY_CLASS = &H20&
Public Const GW_HWNDNEXT = 2


Public Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type


Public Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadId As Long
End Type


Public Type CWPSTRUCT
lParam As Long
wParam As Long
message As Long
hWnd As Long
End Type



Public hHook As Long
Public proc_info As PROCESS_INFORMATION



Public Function StartHook()
hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf Hook_Func, proc_info.dwProcessID, proc_info.dwThreadId)
End Function

Public Sub StopHook()
UnhookWindowsHookEx hHook
End Sub

Public Function Hook_Func(ByVal iCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim CWP As CWPSTRUCT

CopyMemory CWP, ByVal lParam, Len(CWP)

If CWP.message = WM_COMMAND Then
Debug.Print CWP.wParam
End If

Hook_Func = CallNextHookEx(hHook, iCode, wParam, lParam)

End Function


Public Function ProcIDFromWnd(ByVal hWnd As Long) As Long

Dim idProc As Long

GetWindowThreadProcessId hWnd, idProc
ProcIDFromWnd = idProc

End Function


Public Function hWndFromPID(ByVal hInstance As Long) As Long

Dim tempHwnd As Long
   
tempHwnd = FindWindow(vbNullString, vbNullString)


Do Until tempHwnd = 0

If GetParent(tempHwnd) = 0 Then

If hInstance = ProcIDFromWnd(tempHwnd) Then
hWndFromPID = tempHwnd
Exit Do
End If

End If
   

tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT)
   
Loop
   
End Function


Public Function ExecCmd(ByVal cmdline As String) As Long

Dim start As STARTUPINFO
Dim ret As Long
Dim hWndApp As Long


Dim x As Byte

x = 0



start.cb = Len(start)

ret = CreateProcess(0, cmdline, 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, start, proc_info)


RTR:
 
Sleep 50


hWndApp = hWndFromPID(proc_info.dwProcessID)

If hWndApp > 0 Then

ExecCmd = hWndApp


Else


If x = 5 Then
GoTo EXT
Else
x = x + 1
GoTo RTR
End If


End If


EXT:
      
ExecCmd = hWndApp
    
End Function



Форма:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Option Explicit



Private Sub Command1_Click()

Dim hWndApp As Long

hWndApp = ExecCmd(App.Path & "\1.exe")
If hWndApp > 0 Then StartHook

Me.Caption = hWndApp & Chr(32) & hHook

End Sub


Private Sub Command2_Click()

If hHook > 0 Then StopHook
CloseHandle proc_info.hProcess

End Sub


Private Sub Form_Unload(Cancel As Integer)
Command2_Click
End Sub
...
Рейтинг: 0 / 0
Установить хук на указанное приложение
    #39961220
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему тут глобальный хук нужно ставить. И соответственно писать DLL для этого.
...
Рейтинг: 0 / 0
Установить хук на указанное приложение
    #39961237
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eolt , понял, спасибо вам! скажите, использование *.TLB обязательно для компиляции DLL?
...
Рейтинг: 0 / 0
Установить хук на указанное приложение
    #39961239
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
похоже, нашёл подходящее решение без DLL и TLB, буду пробовать: https://wasm.in/threads/gotovye-proekty-na-vb6.31728/
...
Рейтинг: 0 / 0
Установить хук на указанное приложение
    #39961527
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё получилось! Действительно, всё работает без *.DLL, *.TLB. Авторский исходник прикладываю к сообщению.
...
Рейтинг: 0 / 0
Установить хук на указанное приложение
    #39967664
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл указать: автор TheTrick
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Установить хук на указанное приложение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]