Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149

"Проглатываются" нажатия клавиш или клики мыши

16.08.2017, 04:27. Показов 1251. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для примера: форма запускается в невидимом режиме. При нажатии ЛКМ+ПКМ она показывается.

Модуль:
Кликните здесь для просмотра всего текста
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
Public Enum HookFlags
   HFMouseDown = 1
   HFMouseUp = 2
   HFKeyDown = 8
   HFKeyUp = 16
End Enum
 
Private 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
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long)
Private Declare Function GetForegroundWindow& Lib "user32" ()
Private Declare Function GetWindowThreadProcessId& Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long)
Private Declare Function GetKeyboardLayout& Lib "user32" (ByVal dwLayout As Long)
Private Declare Function MapVirtualKeyEx Lib "user32" Alias "MapVirtualKeyExA" (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
 
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOREDRAW = &H8
 
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
 
Private Const WH_JOURNALRECORD = 0
 
Type EVENTMSG
     wMsg As Long
     lParamLow As Long
     lParamHigh As Long
End Type
 
Dim EMSG As EVENTMSG
Dim hHook As Long, frmHooked As Form, hFlags As Long
 
 
Private Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If nCode < 0 Then
     HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
     Exit Function
  End If
  Dim i%, j%
  CopyMemory EMSG, ByVal lParam, Len(EMSG)
  Select Case EMSG.wMsg
    Case WM_LBUTTONDOWN, WM_RBUTTONDOWN
       If (hFlags And HFMouseDown) = HFMouseDown Then
         If GetAsyncKeyState(vbKeyShift) Then i = 1
         If GetAsyncKeyState(vbKeyControl) Then i = 2
         If GetAsyncKeyState(vbKeyMenu) Then i = 4
         frmHooked.System_MouseDown 2 ^ ((EMSG.wMsg - 513) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh)
       End If
    Case WM_LBUTTONUP
       If (hFlags And HFMouseUp) = HFMouseUp Then
         If GetAsyncKeyState(vbKeyShift) Then i = 1
         If GetAsyncKeyState(vbKeyControl) Then i = 2
         If GetAsyncKeyState(vbKeyMenu) Then i = 4
         frmHooked.System_MouseUp 2 ^ ((EMSG.wMsg - 514) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh)
       End If
  End Select
  Call CallNextHookEx(hHook, nCode, wParam, lParam)
End Function
 
Public Sub SetHook(fOwner As Form, flags As HookFlags)
   hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, App.hInstance, 0)
   Set frmHooked = fOwner
   hFlags = flags
   Window_SetAlwaysOnTop frmHooked.hwnd, True
End Sub
 
Public Sub RemoveHook(isFrm As Form)
   UnhookWindowsHookEx hHook
   Window_SetAlwaysOnTop isFrm.hwnd, False
   Set isFrm = Nothing
End Sub
 
Private Function Window_SetAlwaysOnTop(hwnd As Long, bAlwaysOnTop As Boolean) As Boolean
   Window_SetAlwaysOnTop = SetWindowPos(hwnd, -2 - bAlwaysOnTop, 0, 0, 0, 0, SWP_NOREDRAW Or SWP_NOSIZE Or SWP_NOMOVE)
End Function


Форма:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim isMouseState As Boolean
 
 
Public Sub System_MouseDown(Button As Integer, Shift As Integer, X As Single, y As Single)
   If Button = vbLeftButton Then isMouseState = True
   
   If Button = vbRightButton And isMouseState Then
      Call RemoveHook(Me)
      Me.Show
   End If
End Sub
 
Public Sub System_MouseUp(Button As Integer, Shift As Integer, X As Single, y As Single)
   If Button = vbLeftButton Then isMouseState = False
End Sub
 
Private Sub Form_Load()
   Call SetHook(Me, HFMouseDown + HFMouseUp)
End Sub


Вопрос. При работе такой программе в режиме отслеживания у меня на WinXP "проглатываются" нажатия клавиш(приходится нажимать повторно) или клики мышкой. На Win7 такой проблемы нет. Почему?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2017, 04:27
Ответы с готовыми решениями:

Имитация нажатия клавиш мыши
Здравствуйте. Мне нужно имитировать нажатия клавиш мыши после клики по определенной клавиши на клавиатуре. Задача такая: Нужно сделать...

Имитация нажатия клавиш мыши
Добрый день всем! Я хотел сделать автоматическую вставку текста из буфера, надо имитировать нажатие сначала клик правой мыши (свойства) ,...

Как отловить нажатия клавиш мыши?
Как отловить нажатия клавиш мыши средствами winapi? Делаю в Dev-Cpp

2
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
19.08.2017, 15:33
Лучший ответ Сообщение было отмечено CharlyChaplin как решение

Решение

потому что GetAsyncKeyState - это асинхронный отлов нажатий, и вызов его в хуке приводит к проглатываниям , тебе нужно ловить wparam и переводить в нужный символ.

https://msdn.microsoft.com/ru-... s.85).aspx

https://msdn.microsoft.com/ru-... s.85).aspx
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
21.08.2017, 15:35
CharlyChaplin, можешь ещё посмотреть реализацию LowLevel-хуков: https://www.cyberforum.ru/blog... g1943.html
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2017, 15:35
Помогаю со студенческими работами здесь

Обработчик событий нажатия клавиш мыши
У меня есть полудоделанная лабораторная работа по этому задания: Разработать программу, выводящую символ «%» в позицию, в которой...

Создание бота, синхронизирующего нажатия клавиш и движения мыши
Здравстуйте! Для одной игры нужно, чтобы последовательно нажимались клавиши A и D, с частотой 100 милисекунд, и, когда нажимается клавиша...

Перехват одновременного нажатия двух клавиш мыши (левая и правая)
Доброго времени суток! Я реализую игру &quot;сапёр&quot; и во время её создания у меня возникла проблема: не могу перехватить клик двумя кнопками...

Эмуляция нажатия клавиш для неактивных WPF приложений или эмуляция глобальных горячих клавиш
Столкнулся с тем, что следующий код (нажатия опредлённых клавиш) не работает для такой программы как Snagit, и даже не похоже, что фокус...

Двойные клики мыши во всех браузерах, так же если браузер запущен двойные клики происходят во всей ОС
Так же сам по себе открывается explorer


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru