Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156

Имитация нажатия клавиши Tab в стороннем приложении (игре)

08.09.2014, 15:26. Показов 6665. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблемка вот в чем. Скорее всего я не до конца понимаю принцип работы функций, которые использую.

Простая программка, через промежутки времени жмет на кнопку:
Visual Basic
1
2
3
Private Sub Timer1_Timer()
Call keybd_event(VK_TAB, 0, 0, 0)
End Sub
Либо так тоже пробовал:
Visual Basic
1
SendKeys "{TAB}", True
Мне нужен Tab, но с другими кнопками тоже не пашет. К примеру, когда брал нолик, при запуске программка успешно записывала его в текстбоксы и ворды, либо при запуске игры - в чат.

Но вот действия, которые должны просиходить в игре при нажатии Tab или того же нолика - не происходят.
В чем пробема?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.09.2014, 15:26
Ответы с готовыми решениями:

Имитация нажатия ПКМ в стороннем приложении
Привет, понимаю что тема обсуждалась миллион раз, но я уже перерыл все что нашел и никак не дойдет что не так... Смотрите, смастерил хук на...

Имитация нажатия на кнопки в стороннем приложении
Во общем ситуация такая, есть установщик, в нём кнопка старт, после нажатия на нее появляется соглашение, ну и дальше появляются разные...

Перехват и имитация нажатия клавиши клавиатуры в чужом приложении
Есть тема... Нужно, чтобы при нажатии на кнопку, например f1 . У меня последовательно с разными задержками нажимались кнопки: ESC ...

27
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
09.09.2014, 01:53
Студворк — интернет-сервис помощи студентам
Вот накидал примерчик с обработкой ввода клавиатуры посредством DirectInput. Можно проверять на нем действия функций. Для работы нужен DirectX8 и библиотека dv8vb.
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
Option Explicit
 
Implements DirectXEvent8
 
Dim dx      As DirectX8
Dim di      As DirectInput8
Dim dev     As DirectInputDevice8
Dim hEvent  As Long
Dim diProp  As DIPROPLONG
Dim key()   As DIDEVICEOBJECTDATA
Dim map     As Variant
 
Private Const MAPVK_VSC_TO_VK = 1
 
Private Sub cmdClear_Click()
    lstKeys.Clear
End Sub
 
Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
    If eventid = hEvent Then
        Dim count   As Long
        Dim index   As Long
        Dim keyName As String
        
        count = dev.GetDeviceData(key(), DIGDD_DEFAULT)
        
        For index = 0 To count - 1
            
            If key(index).lData And &H80 Then
                keyName = map(key(index).lOfs) & " up"
            Else
                keyName = map(key(index).lOfs) & " press"
            End If
            
            lstKeys.AddItem keyName
            lstKeys.ListIndex = lstKeys.NewIndex
        Next
        
    End If
End Sub
 
Private Sub Form_Load()
    Set dx = New DirectX8
    Set di = dx.DirectInputCreate()
 
    Set dev = di.CreateDevice("GUID_SysKeyboard")
    
    dev.SetCommonDataFormat DIFORMAT_KEYBOARD
    dev.SetCooperativeLevel hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
 
    hEvent = dx.CreateEvent(Me)
    dev.SetEventNotification hEvent
    
    diProp.lHow = DIPH_DEVICE
    diProp.lData = 40
    
    ReDim key(39)
    CreateMap
    
    dev.SetProperty "DIPROP_BUFFERSIZE", diProp
    
    dev.Acquire
    
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    dev.Unacquire
    Set dev = Nothing
    Set di = Nothing
    Set dx = Nothing
End Sub
 
Private Sub CreateMap()
    map = Array("", "ESCAPE", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "MINUS", "EQUALS", "BACKSPACE", _
                "TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LBRACKET", "RBRACKET", "RETURN", "LCONTROL", _
                "A", "S", "D", "F", "G", "H", "J", "K", "L", "SEMICOLON", "APOSTROPHE", "GRAVE", "LSHIFT", "BACKSLASH", "Z", _
                "X", "C", "V", "B", "N", "M", "COMMA", "PERIOD", "SLASH", "RSHIFT", "NUMPADSTAR", "LALT", "SPACE", "CAPSLOCK", "F1", _
                "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "NUMLOCK", "SCROLL", "NUMPAD7", "NUMPAD8", "NUMPAD9", "NUMPADMINUS", _
                "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPADPLUS", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD0", "NUMPADPERIOD", "", "", "OEM_102", "F11", "F12", "", _
                "", "", "", "", "", "", "", "", "", "", "F13", "F14", "F15", "", "", _
                "", "", "", "", "", "", "", "KANA", "", "", "ABNT_C1", "", "", "", "", _
                "", "CONVERT", "", "NOCONVERT", "", "YEN", "ABNT_C2", "", "", "", "", "", "", "", "", _
                "", "", "", "", "", "", "NUMPADEQUALS", "", "", "PREVTRACK", "AT", "COLON", "UNDERLINE", "KANJI", "STOP", _
                "AX", "UNLABELED", "", "NEXTTRACK", "", "", "NUMPADENTER", "RCONTROL", "", "", "MUTE", "CALCULATOR", "PLAYPAUSE", "", "MEDIASTOP", _
                "", "", "", "", "", "", "", "", "", "VOLUMEDOWN", "", "VOLUMEUP", "", "WEBHOME", "NUMPADCOMMA", _
                "", "NUMPADSLASH", "", "SYSRQ", "RALT", "", "", "", "", "", "", "", "", "", "", _
                "", "", "PAUSE", "", "HOME", "UPARROW", "PGUP", "", "LEFTARROW", "", "RIGHTARROW", "", "END", "DOWNARROW", "PGDN", _
                "INSERT", "DELETE", "", "", "", "", "", "", "", "LWIN", "RWIN", "APPS", "POWER", "SLEEP", "", _
                "", "", "WAKE", "", "WEBSEARCH", "WEBFAVORITES", "WEBREFRESH", "WEBSTOP", "WEBFORWARD", "WEBBACK", "MYCOMPUTER", "MAIL", "MEDIASELECT", "", "", _
                "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")
End Sub
 
Private Sub lstKeys_KeyDown(KeyCode As Integer, Shift As Integer)
    KeyCode = 0
End Sub
 
Private Sub lstKeys_KeyPress(KeyAscii As Integer)
    KeyAscii = 0
End Sub
Используется буферизированный событийный ввод.
Вложения
Тип файла: rar DirectInput.rar (10.0 Кб, 13 просмотров)
3
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
09.09.2014, 16:49  [ТС]
Прикольно. А можно как-нибудь добавить глобальный перехват клавиш, не используя GetAsyncKeyState?

Ой только что посмотрел, даже на заднем фоне нажатия фиксирует

Добавлено через 5 минут
Я вот использовал GetAsyncKeyState, чтобы запускать нажатия определенной кнопкой, и работает более-менее. Но иногда не срабатывает. Скорее всего это из-за искусственной задержки, но без нее не работает. Можно чем-то заменить?

Visual Basic
1
2
3
4
5
6
7
8
Function GetPressedKey() As String
For schetchik = 32 To 128
If GetAsyncKeyState(schetchik) <> 0 Then
GetPressedKey = Chr$(schetchik)
Exit For
End If
Next
End Function
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim i As Single
Dim j As Single
Call keybd_event(temp, MapVirtualKey(temp, 0), 0, 0)
For i = 1 To 800
For j = 1 To 800
Next
Next
Call keybd_event(temp, MapVirtualKey(temp, 0), KEYEVENTF_KEYUP, 0)
For i = 1 To 800
For j = 1 To 800
Next
Next
Добавлено через 8 минут
Ну ладно, это в принципе не так критично. Больше всего интересует вопрос, можно нажатия в определенное приложение отправлять? Т.е. я выбрал процесс, окно свернуто, я делаю что хочу, а кнопки в выбранном приложении жмутся?
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
09.09.2014, 16:55
Цитата Сообщение от aptos Посмотреть сообщение
Прикольно. А можно как-нибудь добавить глобальный перехват клавиш, не используя GetAsyncKeyState?
Можно. Глобальный или низкоуровневый хук на клавиатуру. Если клавиша одна-две зарегистрировать горячие клавиши. Также этот пример с DirectInput перехватывает нажатия в независимости от активности приложения.
Цитата Сообщение от aptos Посмотреть сообщение
For i = 1 To 800
For j = 1 To 800
Next
Next
Так вообще нельзя делать, лучше уж Sleep, а еще лучше по таймеру.
Цитата Сообщение от aptos Посмотреть сообщение
Т.е. я выбрал процесс, окно свернуто, я делаю что хочу, а кнопки в выбранном приложении жмутся?
Да. Смотри AttachThreadInput.
1
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
09.09.2014, 18:55  [ТС]
Насколько я понял, вариант под vb6 вот:
Visual Basic
1
Private Declare Function apiAttachThreadInput Lib "user32" Alias "AttachThreadInput" (ByVal idThreadAttach As Int32, ByVal idThreadAttachTo As Int32, ByVal fAttach As Int32) As Int32
И мне, чтобы найти процесс для прикрепления, надо использовать?:
Visual Basic
1
Private Declare Function apiGetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hWnd As Int32, ByRef lpdwProcessId As Int32) As Int32
Только вот ругается у меня на тип Int32, пользовательский, говорит.
Где можно найти синтаксис под vb6?

Добавлено через 9 минут
На MSDN указан 32-битный беззнаковый тип, а на vb6, говорят, нету такого.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
09.09.2014, 18:58
Цитата Сообщение от aptos Посмотреть сообщение
Насколько я понял, вариант под vb6 вот:
Нет. int32 в VB6 нет, спользуй Long. Вообще скачай себе какой-нибудь API Viewer для деклараций.
Цитата Сообщение от aptos Посмотреть сообщение
И мне, чтобы найти процесс для прикрепления, надо использовать?:
Это смотря каков критерий поиска (по окну, по имени процесса, и пути и т.д) соответственно разные способы.
1
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
09.09.2014, 18:58  [ТС]
0
 Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156
10.09.2014, 16:50  [ТС]
А оки..
Только API-viewer мой не запускается.. Может из-за семерки винды.)

Добавлено через 13 минут
А вот, нашел нормальный, буду смотреть.
0
1 / 1 / 0
Регистрация: 16.07.2017
Сообщений: 35
22.08.2017, 20:33
Помогите пожалуйста ! Нужен код и скрин формы , что бы имитировать нажатие клавиш "W" "Q" "W" "Q" , при нажатие на клавишу "1" . Буду очень благодарен ! Уже недели 2 ищу , не получается в Чате и консоли , а так же в блокнотах всё работает , а в самой игре нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2017, 20:33

Имитация нажатия клавиш в стороннем окне
Я знаю текст заголовка окна. Как мне передать в него нажатия клавиш и в том числе специальных - таких как esc, enter? Можно пойти иным...

Нажатие кнопок в стороннем приложении (игре)
Приложение должно способом имуляции нажимать на кнопки в игре, но данные способ не работает, тоесть приложение работает только на рабочем...

Имитация нажатия Tab с помощью keybd_event
Имитирую нажатия клавиш в сторонней программе с помощью Private Declare Sub keybd_event Lib &quot;user32.dll&quot; _ ...

Опрос нажатия кнопки в стороннем приложении
Добрый день, пишу на VS2017 код, который должен выдать реакцию при клике мышкой на цифре &quot;9&quot; калькулятора. Экспериментальным...

Эмуляция нажатия клавиш в стороннем приложении
я запускаю процесс, а значит я имею всё о этом процессе(хэндл и прочее) и мне нужно послать на этот процесс нажатия клавишь. мне нужно,...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru