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

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

08.09.2014, 15:26. Показов 6204. Ответов 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru