Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
646 / 474 / 39
Регистрация: 04.11.2013
Сообщений: 1,951

Эмуляция нажатия клавиш в приложении под управлением DirectX

16.04.2016, 09:27. Показов 2913. Ответов 3

Студворк — интернет-сервис помощи студентам
Доброго времени.

Перелопатил кучу инфы, и слегка запутался.
Задача - клацнуть клавишей в приложении под управлением DirectX

Простой короткий код, половина которого работает, половина нет:

VB.NET
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
Public Class Form1
 
    Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
 
 
    Private Const MOUSEEVENTF_LEFTDOWN = &H2
    Private Const MOUSEEVENTF_LEFTUP = &H4
 
    Private Const KEYEVENTF_KEYUP = &H2 'событие отпускания клавиши
    Private Const KEYEVENTF_EXTENDEDKEY = &H1
    Private Const VK_Q = &H51  'клавиша q
 
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
'Переключаемся а окно нашей программы, работает
        ProgHandle = FindWindow(vbNullString, "Dx_program")
        If ProgHandle = IntPtr.Zero Then
            MsgBox("Программа не найдена")
            End_work() 'в конце дописан метод завершения программы, не буду тут приводить
        End If
        SetForegroundWindow(ProgHandle)
 
threading.thread.sleep(1000)
 
' клацаем мышкой - РАБОТАЕТ
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 3, 3)
                Thread.Sleep(50)
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 3, 3)
 
' Жмем Q - НЕ РАБОТАЕТ
                keybd_event(VK_Q, 0, KEYEVENTF_EXTENDEDKEY, 0)
                Thread.Sleep(50)
                keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0)
 
End sub
 
End class

Почитал вот эти источники (и еще кучу других):
Имитация нажатия клавиши Tab в стороннем приложении (игре)
http://visualbasic.happycoding... ode38.html
[ссылка на форум]

Пришел к выводу, что надо получить скэн-код клавиши Q в переменную, скажем, lScan. и поставить во вторую позицию в функцию keybd_event:

VB.NET
1
2
3
4
                Dim lScan As Long
                lScan = MapVirtualKey(VK_Q, 0)
 
                keybd_event(VK_Q, lScan, KEYEVENTF_EXTENDEDKEY, 0)
И все, на этом встрял. MapVirtualKey(VK_Q, 0) - это неправильный код, туда надо передавать вместo VK_Q какой-то код клавиши wCode типа long, а где его взять - хз, и что это вообще такое?

Можете мне объяснить, где взять нужный код для клавиши (не byte а long)? Или я вообще не в ту степь залез? и почему эмуляция мышки работает, а аналогичная эмуляция клавиатуры - нет?

Во второй приведенной мной ссылке есть метод получения этого кода клавиши, но я его не понимаю, у меня он вообще не работает (VS2010 Ultimate):

VB.NET
1
2
3
4
5
Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar As Byte) As Long
 
...
 
lVK = VkKeyScan(Asc(sKey))
У меня подчеркивает cChar (ключевое слово не может использоваться в качестве идентификатора)
Вобщем, помогите, пожалуйста, разобраться в каше в моей голове.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2016, 09:27
Ответы с готовыми решениями:

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

Эмуляция нажатия клавиш в стороннем приложении
Добрый день. Есть тестовое приложение, оно содержит один элемент меню, на котором висит shortcut(Ctrl+L) и командную кнопку. Если я нажимаю...

Эмуляция нажатия клавиш для другого приложения (Win10 Под D3D) не работает
Добрый день! У меня такая трабла возникла. Нужно В игре под директ3Д зажать правую кнопку мышки на несколько секунд и отпустить. Вот код...

3
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
16.04.2016, 21:52
Цитата Сообщение от Proidoha Посмотреть сообщение
У меня подчеркивает cChar
Правильно говорит. Есть функции преобразования типов вида CInt, CDbl, CStr и так далее. CChar - относится к этим функциям. Придумайте другое имя. например myChar)))

Добавлено через 3 минуты
А еще посмотрите здесь

Добавлено через 1 минуту
Там кстати приведены коды клавиш (в системе HEX)
1
646 / 474 / 39
Регистрация: 04.11.2013
Сообщений: 1,951
17.04.2016, 14:29  [ТС]
Цитата Сообщение от Winney Посмотреть сообщение
А еще посмотрите здесь
Спасибо, видел. Не подходит, тип "SendKeys" имеет функции Send (на него пишет, что приложение не поддерживает нажатие клавиш Windows) и SendWait - ничего не происходит.


Взял за основу код по второй ссылке, испавил ошибки, связанные с устаревшими объявлениями событий и методов (поменял на новые), запихнул его в отдельный класс SendKeysClass.

Попытался в своей программе сделать так:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Imports MyProgram.SendKeysClass
 
''''' ..... ''''
Public Class Form1
 
''''' ..... ''''
 
Private Sub Navik_q()
 
''''' ..... ''''
     PressKeyVK(eKeys.keyQ) ' это метод из класса SendKeysClass
''''' ..... ''''
 
End sub
End Class
Получил ошибку "Ссылка на член, не являющийся общим, должна быть ссылкой на объект. " Подчеркнуто PressKeyVK.

Как его правильно вызвать?
SendKeysClass имеет оператор Public, метод PressKeyVK в нем - тоже.


П.С. Памирыч, вставил ссылку на вражеский форум не со зла и без задней мысли, извиняюсь, больше не буду. Как бы мне ее назад получить? Там было что-то полезное, лопатить историю браузера (>300 страниц посещенных) как-то ППЦ обидно.
0
646 / 474 / 39
Регистрация: 04.11.2013
Сообщений: 1,951
27.04.2016, 16:39  [ТС]
Решил задачу. Все оказалось ОЧЕНЬ просто:

VB.NET
1
2
3
                keybd_event(VK_Q, VK_Q_SCAN, 0, 0) 'нажимаем клавишу Q
                Thread.Sleep(50)' ждем 50 мс
                keybd_event(VK_Q, VK_Q_SCAN, KEYEVENTF_KEYUP, 0) ' отпускаем клавишу Q
Вся соль в двух переменных:

VK_Q - код виртуальной клавиши, начинается с "&H" дальше идет шестнадцатиричная цифра. Коды виртуальных клавиш смотрим тут: http://api.farmanager.com/ru/w... codes.html (столбец "значение(hex)")

VK_Q_SCAN - код реальной клавиши. В абсолютном большинстве примеров в интернете на месте этого значения стоит 0, и если приложение не работает с user32.dll - клавиша нажиматься не будет. А с кодом реальной клавиши будет, вне зависимости - происходит хук клавиатуры приложением или нет.
Коды реальных клавиш смотрим тут: https://msdn.microsoft.com/en-... 2147217396 Столбец "scan code" - "dec".
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.04.2016, 16:39
Помогаю со студенческими работами здесь

Перехватчик клавиш + эмуляция нажатия клавиш
Здравствуйте! Срочно нужна помощь! Моя программа работает в фоновом режиме. Мне нужно: 1) чтобы где бы я не находился в среде,...

Эмуляция нажатия клавиш
Хочу написать программу, что бы она сама выполняла определенные действия клавиатуры за меня. как это возможно сделать?8-)

Эмуляция нажатия клавиш.
Программа заключается в том, чтоб был постоянно повторяющийся цикл(по моему так) раз в пол минуты(не пренципиально можно и минуту но не...

Эмуляция нажатия клавиш
Люди, задам может быть тупой вопрос, но возможно ли программно в jquery или js эмулировать нажатия клавиш клавиатуры или мыши?

Эмуляция нажатия клавиш
помогите с кодом разобраться, не работает( Var PWD, Login : String; procedure PressingKeyboard(Key: byte; extra:...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru