powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Блокировка клавиш после перехвата
3 сообщений из 3, страница 1 из 1
Блокировка клавиш после перехвата
    #39968610
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Сделал хук, необходимо, чтобы блокировались клавиши: Alt+Tab, Win+R, Win+D, Ctrl, LWin, RWin. Перехват идёт стабильно: в Form1.List3 добавляется строчка после каждого нажатия/отжатия, но заблокировать стабильно не удаётся. Через раз работает, а иногда и реже.
Подскажите, пожалуйста, в чём может быть причина?

Код: 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.
Public Sub HooksEVN(ByVal eMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
 
 
Dim pos As POINTAPI
 
 
Select Case eMsg
 
Case WM_KEYDOWN
 
Form1.List3.AddItem (wParam And &HFF) & " down" & wParam & " " & lParam
 
If GetAsyncKeyState(VK_LWIN) Or GetAsyncKeyState(VK_RWIN) Then PressBtn vbKeyEscape
If GetAsyncKeyState(vbKeyControl) Then PressBtn vbKeyEscape
 
If GetAsyncKeyState(VK_LWIN) And &HF0000000 And MapVirtualKey(lParam, 1) = Asc("R") Then PressBtn vbKeyEscape
If GetAsyncKeyState(VK_RWIN) And &HF0000000 And MapVirtualKey(lParam, 1) = Asc("R") Then PressBtn vbKeyEscape
 
If GetAsyncKeyState(VK_LWIN) And &HF0000000 And MapVirtualKey(lParam, 1) = Asc("D") Then PressBtn vbKeyEscape
If GetAsyncKeyState(VK_RWIN) And &HF0000000 And MapVirtualKey(lParam, 1) = Asc("D") Then PressBtn vbKeyEscape
 
If (GetAsyncKeyState(vbKeyMenu) And &HF0000000) And (GetAsyncKeyState(vbKeyTab) And &HF0000000) Then PressBtn vbKeyEscape
 
 
Case WM_KEYUP
Form1.List3.AddItem wParam
 
Case WM_COMMAND
Form1.List3.AddItem wParam
 
 
Case WM_CANCELJOURNAL 'пользователь нажал ctrl+esc или ctrl+alt+del (защита системы от нашего зависания)
 
HooksStop
 
End Select
 
End Sub
 
Public Sub PressBtn(ByVal btn1 As Byte, Optional ByVal btn2 As String = "")
 
 
If btn2 = "" Then
 
Call keybd_event(btn1, 0, KEYEVENTF_KEYDOWN, 0)
Call keybd_event(btn1, 0, KEYEVENTF_KEYUP, 0)
 
 
Else
 
 Call keybd_event(btn1, 0, KEYEVENTF_KEYDOWN, 0)
 Call keybd_event(btn2, 0, KEYEVENTF_KEYDOWN, 0)
 ' Simulate key release
 Call keybd_event(btn2, 0, KEYEVENTF_KEYUP, 0)
 Call keybd_event(btn1, 0, KEYEVENTF_KEYUP, 0)
 
 
End If
 
 
 
End Sub
 
 
Public Sub HooksStart()
 
UserHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookUsrProc, App.hInstance, 0)
WndHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookWndProc, App.hInstance, App.threadID)
 
End Sub
 
Public Function HookWndProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
Dim eMsg As EventMsgWND
 
 
If nCode < 0 Then
HookWndProc = CallNextHookEx(WndHook, nCode, wParam, lParam)
Else
 
CopyMemory eMsg, ByVal lParam, Len(eMsg)
 
HookWndProc = CallNextHookEx(WndHook, nCode, wParam, lParam)
HooksEVN eMsg.wMsg, eMsg.wParam, eMsg.lParam ', eMsg.msgTime, eMsg.hWndMsg
 
End If
 
 
End Function
 
 
Public Function HookUsrProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
Dim eMsg As EventMsgUSR
 
 
If nCode < 0 Then ' было просто "If nCode Then"
HookUsrProc = CallNextHookEx(UserHook, nCode, wParam, lParam)
Else
 
CopyMemory eMsg, ByVal lParam, Len(eMsg)
 
HookUsrProc = CallNextHookEx(UserHook, nCode, wParam, lParam)
HooksEVN eMsg.wMsg, eMsg.wParam, eMsg.lParam ', eMsg.msgTime, eMsg.hWndMsg
 
End If
 
 
End Function
...
Рейтинг: 0 / 0
Блокировка клавиш после перехвата
    #39968686
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли как-то отменить нажатие кнопки или отменить/заблокировать действие после нажатия?
...
Рейтинг: 0 / 0
Блокировка клавиш после перехвата
    #39970967
Don Salieri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совместными усилиями на другом форуме помогли:

Код: 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.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
Public Type EventMsg
 lParam As Long
 wParam As Long
 wMsg As Long
 msgTime As Long
 hWndMsg As Long
End Type
 
 
Public Function HooksStart() As LogVar
 
' wParam: Low (WORD Param)
' lParam: High (LONG Param)
 
HooksStop
 
 
KeybHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HookKeybProc, App.hInstance, 0)
MouseHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookMouseProc, App.hInstance, 0)
 
 
WndHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookWndProc, App.hInstance, App.threadID)
 
 
If KeybHook > 0 And MouseHook > 0 Then
HooksStart = 1
Else
HooksStart = 0
End If
 
End Function
 
Public Sub HooksStop()
 
 
If MouseHook > 0 Then
UnhookWindowsHookEx MouseHook
MouseHook = 0
End If
 
If KeybHook > 0 Then
UnhookWindowsHookEx KeybHook
KeybHook = 0
End If
 
 
If WndHook > 0 Then
UnhookWindowsHookEx WndHook
WndHook = 0
End If
 
 
End Sub
 
Public Function HookWndProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
Dim eMsg As EventMsg 'CWPSTRUCT
 
 
If nCode < 0 Then
HookWndProc = CallNextHookEx(WndHook, nCode, wParam, lParam)
Else
 
CopyMemory eMsg, ByVal lParam, Len(eMsg)
 
HookWndProc = CallNextHookEx(WndHook, nCode, wParam, lParam)
'WndHookEVN eMsg.wMsg, eMsg.wParam, eMsg.lParam ', eMsg.msgTime, eMsg.hWndMsg
HookWndEVN eMsg.wMsg, eMsg.wParam, eMsg.lParam ', eMsg.msgTime, eMsg.hWndMsg
 
End If
 
 
End Function
 
 
 
 
 
Public Function HookKeybProc(ByVal uCode As Long, ByVal wParam As Long, lParam As KBDLLHOOKSTRUCT) As Long
 
 
Dim prevent As LogVar
 
 
If uCode = HC_ACTION Then
 
Select Case wParam
 
 
Case WM_KEYDOWN, WM_SYSKEYDOWN
 
Form1.List3.AddItem wParam & " " & lParam.VkCode & " " & lParam.ScanCode & IIf(lParam.flags And LLKHF_INJECTED, "(inj)", vbNullString)
 
 
If lParam.VkCode = VK_LWIN Then prevent = 1 'LWIN
If lParam.VkCode = VK_RWIN Then prevent = 1 'RWIN
 
 
 
 
 
If CBool(GetAsyncKeyState(vbKeyControl) And &H8000) Then prevent = 1 ' Ctrl
If CBool(lParam.flags And LLKHF_ALTDOWN) Then prevent = 1 ' Alt
If lParam.VkCode = vbKeyDelete Then prevent = 1 ' Delete
 
 
 
'
' Alt + Tab
If lParam.flags And LLKHF_ALTDOWN And lParam.VkCode = 9 Then prevent = 1
'If lParam.flags And LLKHF_ALTDOWN And lParam.VkCode = 9 Then prevent = 1
 
'If lParam.VkCode = 27 Then
 
' If GetAsyncKeyState(vbKeyShift) < 0 And GetAsyncKeyState(vbKeyControl) < 0 Then prevent = 1
 
' Ctrl + Esc
 If (lParam.VkCode = vbKeyEscape) And CBool(GetAsyncKeyState(vbKeyControl) And &H8000) Then prevent = 1
 
 ' Alt + Esc
   If (lParam.VkCode = vbKeyEscape) And CBool(lParam.flags And LLKHF_ALTDOWN) Then prevent = 1
 
 ' Alt + F4
  If (lParam.VkCode = vbKeyF4) And CBool(lParam.flags And LLKHF_ALTDOWN) Then prevent = 1
'End If
If lParam.VkCode = vbKeyF2 Then
 
'Form1.HackExit
WindowPrieksh hWnd_target_hook, 1
WindowSetState Form1.hwnd, SW_NORMAL, 1
 
End If
 
If lParam.VkCode = vbKeyF3 Then prevent = 1
'
 
 '  If (lParam.VkCode = vbKeyTab) And _
 '        (lParam.flags And _
 '        LLKHF_ALTDOWN) Then prevent = 1
 
 
If prevent = 1 Then
Form1.List3.AddItem "HOOK"
 
    HookKeybProc = -1
    Exit Function
End If
 
 
Case WM_KEYUP, WM_SYSKEYUP
'Case WM_SYSKEYDOWN
'Case WM_SYSKEYUP
 
 
 
 
'frmMain.lstEvenst.AddItem KeyString(wParam) & "KeyCode: " & lParam.VkCode & " ScanCode: " & lParam.ScanCode & IIf(lParam.flags And LLKHF_INJECTED, "(inj)", vbNullString)
'frmMain.lstEvenst.ListIndex = frmMain.lstEvenst.ListCount - 1
 
 
 
 
End Select
 
 
End If
 
 
 
    HookKeybProc = CallNextHookEx(KeybHook, uCode, wParam, lParam)
 
 
End Function
 
 
  Public Function HookMouseProc(ByVal uCode As Long, ByVal wParam As Long, lParam As MSLLHOOKSTRUCT) As Long
 
 
Dim pt As POINTAPI
 
 
 If uCode = HC_ACTION Then
 
Select Case wParam
 
 
Case WM_MOUSEMOVE
 
'Form1.List3.AddItem  lParam.pt.x & ", " & lParam.pt.y  & IIf(lParam.flags And LLMHF_INJECTED, "(inj)", vbNullString)
 
Case WM_MOUSEWHEEL
 
'Form1.List3.AddItem lParam.pt.x & ", " & lParam.pt.y & " Dir: " & IIf(lParam.mouseData > 0, "Forward", "Backward") & IIf(lParam.flags And LLMHF_INJECTED, "(inj)", vbNullString)
 
 
Case Else
 
'frmMain.lstEvenst.AddItem MouseString(wParam) & " Coord: " & lParam.pt.x & ", " & lParam.pt.y & IIf(lParam.flags And LLMHF_INJECTED, "(inj)", vbNullString)
'frmMain.lstEvenst.ListIndex = frmMain.lstEvenst.ListCount - 1
 
 
End Select
 
 
End If
 
 
    HookMouseProc = CallNextHookEx(MouseHook, uCode, wParam, lParam)
 
End Function
 
 
  Public Sub HookWndEVN(ByVal eMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
 
 
 
    Select Case eMsg
 
 
 
 '''  Case WM_ACTIVATEAPP
'''Form1.Caption = "0"
 
'''Case WM_ACTIVATE
'''Form1.Caption = "1"
 
Case WM_COMMAND
Form1.List3.AddItem wParam
 
 
 
 
 
'''Case WM_CANCELJOURNAL 'пользователь нажал ctrl+esc или ctrl+alt+del (защита системы от нашего зависания)
 
'''HooksStop
 
'Form1.WorkExit
 
   End Select
 
 
End Sub




Есть одно замечание: когда нажимаешь Ctrl+Alt+Delete или просто Ctrl+Alt, не срабатывает отмена.

Код: vbnet
1.
If CBool(GetAsyncKeyState(vbKeyControl) And &H8000) and CBool(lParam.flags And LLKHF_ALTDOWN) and lParam.VkCode = vbKeyDelete Then prevent = 1
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Блокировка клавиш после перехвата
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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