Аватар для aptos
13 / 13 / 3
Регистрация: 04.06.2013
Сообщений: 156

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

08.09.2014, 15:26. Показов 6399. Ответов 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
Модератор
10060 / 3905 / 884
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 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
Модератор
10060 / 3905 / 884
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 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
Модератор
10060 / 3905 / 884
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru