Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451

Блокировка клавиш после перехвата

12.06.2020, 19:58. Показов 1557. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Сделал хук, необходимо, чтобы блокировались клавиши: Alt+Tab, Win+R, Win+D, Ctrl, LWin, RWin. Перехват идёт стабильно: в Form1.List3 добавляется строчка после каждого нажатия/отжатия, но заблокировать стабильно не удаётся. Через раз работает, а иногда и реже.
Подскажите, пожалуйста, в чём может быть причина?

Visual Basic
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
Добавлено через 4 часа 19 минут
Можно ли как-то отменить нажатие кнопки или отменить/заблокировать действие после нажатия?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2020, 19:58
Ответы с готовыми решениями:

Функция перехвата клавиш
Подскажите как это можно сделать: Пользователь печатает текст, и надо вывести на экран какие клавиши он нажимал к примеру: ...

метод для перехвата клавиш клавиатуры
Здравствуйте,имею метод для перехвата клавиш клавиатуры,но не знаю куда его вставить и как его использовать protected bool...

Работа с клавиатурой, сочетания клавиш, блокировка клавиш
Здравствуйте! Есть такая вот задачка: Разработать программу обработки прерывания от клавиатуры, которая должна: распознавать...

8
 Аватар для UBUNTU
352 / 213 / 42
Регистрация: 04.02.2015
Сообщений: 1,344
12.06.2020, 20:15
Saliery, маленький хакер )))))))))) лови нажатие и сразу посылай отжатие клавиш и все в таймер с 1 сек.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
12.06.2020, 20:24
Лучший ответ Сообщение было отмечено Saliery как решение

Решение

https://www.cyberforum.ru/post7852196.html
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
12.06.2020, 22:57  [ТС]
Цитата Сообщение от UBUNTU Посмотреть сообщение
маленький хакер
почему маленький?
0
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
19.06.2020, 13:31  [ТС]
The trick, спасибо вам огромное!

Visual Basic
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, не срабатывает отмена.

Visual Basic
1
If CBool(GetAsyncKeyState(vbKeyControl) And &H8000) and CBool(lParam.flags And LLKHF_ALTDOWN) and lParam.VkCode = vbKeyDelete Then prevent = 1
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.06.2020, 15:34
Объясни, вот зачем тебе перехватывать Ctrl+Alt+Delete?

То окно на передний план, то это. Смахивает на винлокер.
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
20.06.2020, 15:37  [ТС]
Dragokas, особо незачем, просто для общего развития, чтобы понимать, вообще, как с этим бороться
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.06.2020, 15:39
С кем ты боришься?
1
9 / 9 / 4
Регистрация: 27.01.2013
Сообщений: 451
25.06.2020, 03:25  [ТС]
Dragokas, с системой хуков и перехватов, но я с ней не борюсь, а пытаюсь на практике хоть что-то понять
считаю, что такие простые вещи знать надо
я же не говорю, перехватывать во что бы то ни стало, просто надо понимать, как работает система: что можно, что нельзя, а что надо подумать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2020, 03:25
Помогаю со студенческими работами здесь

Что целесообразнее/лучше использовать для перехвата клавиш: хук или GetAsyncKeyState?
Вопрос более общий вот в чем. При использовании GetAsyncKeyState по таймеру приложение постоянно (помимо естественного висения в...

Как написать код для перехвата, не важно чего, просто перехвата?
как написать код для перехвата , не важно чего просто перехвата ?

Блокировка клавиш
int keypress(int x) { int key = 0; while(key &lt;= 0 || key &gt; x) { key = _getch(); if (key == 27) return 0; else...

Блокировка алфавитных клавиш
Помогите за блокировать буквенную раскладку клавиатуры программно, всех кроме цифр

Блокировка клавиш Alt и F4
Какой командой заблокировать алт и F4


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru