Как эмулировать клавиши посредством функции keybd_event?
|
|
IL-98-YA | Дата: Четверг, 05 Июля 2012, 19:22 | Сообщение # 1 |
UnityUser
Сейчас нет на сайте
| Code using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { [DllImport("user32.dll")] public static extern void keybd_event(Keys bVd, byte bScan, UInt32 dwFlags, IntPtr dwExtraInfo); public const UInt32 KEYEVENTF_EXTENDEDKEY = 0; public const UInt32 KEYEVENTF_KEYUP = 2; public Form1() { timer.Enabled = true; timer.Interval = 10; timer.Start(); InitializeComponent(); } void timer_Tick(object sender, EventArgs e) { ++index; } private void Form1_Load(object sender, EventArgs e) {
} } private void FirstA() { keybd_event(Keys.A, 0x41, KEYEVENTF_EXTENDEDKEY | 0, (IntPtr)0); timer2.Enabled = true;
} private void KeyOne() { keybd_event(Keys.S, 0x53, KEYEVENTF_EXTENDEDKEY | 0, (IntPtr)0); timer2.Enabled = true;
} private void button1_Click(object sender, EventArgs e) { }
private void timer1_Tick(object sender, EventArgs e) { FirstA(); } private void KeyTwo() { keybd_event(Keys.D, 0x44, KEYEVENTF_EXTENDEDKEY | 0, (IntPtr)0); timer3.Enabled = true;
} private void timer2_Tick(object sender, EventArgs e) { KeyTwo(); }
private void timer3_Tick(object sender, EventArgs e) { FirstA(); } } } код выше... почему не работает не знаю проверял на блокноте(по сути он должен начать писать фыв по одной букве в 0.3 секунды... но ничего не происходит).
Сообщение отредактировал IL-98-YA - Четверг, 05 Июля 2012, 19:23 |
|
| |
Нохчи | Дата: Четверг, 05 Июля 2012, 19:45 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Quote (IL-98-YA) проверял на блокноте(по сути он должен начать писать фыв по одной букве в 0.3 секунды... но ничего не происходит) чтоб блокнот думал что нажата клавиша, его окну надо послать сообщение, это такой механизм в винде, от языка это не зависит. Мб в с# есть какие-нибудь кошерные методы чтобы реализовать такое(вообще в нем ни шарю), но можно поюзать винапи
PostMessage(HWND_BROADCAST, WM_KEYDOWN, сканкод_клавиши, 0)
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
IL-98-YA | Дата: Четверг, 05 Июля 2012, 20:06 | Сообщение # 3 |
UnityUser
Сейчас нет на сайте
| я попробовал не только на блокноте... ссылка на проект можете посмотреть и исправить код... где не правильно
|
|
| |
Нохчи | Дата: Четверг, 05 Июля 2012, 20:07 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| ОМГ, очередной ботомейкер. Тут совсем другой подход нужен. Можешь сказать, для какой игры бот ?
Многие вопросы по Windows отпадут, если посмотреть тут
Сообщение отредактировал Нохчи - Четверг, 05 Июля 2012, 20:07 |
|
| |
IL-98-YA | Дата: Четверг, 05 Июля 2012, 20:09 | Сообщение # 5 |
UnityUser
Сейчас нет на сайте
| Мехи Земля
|
|
| |
Demeron | Дата: Четверг, 05 Июля 2012, 20:16 | Сообщение # 6 |
User created in C++
Сейчас нет на сайте
| http://zalil.ru/33543351 - вот, все работает.
|
|
| |
IL-98-YA | Дата: Четверг, 05 Июля 2012, 20:21 | Сообщение # 7 |
UnityUser
Сейчас нет на сайте
| кстати а D1 это что за клавиша? это 1? а да это она... огромное спасибо
Сообщение отредактировал IL-98-YA - Четверг, 05 Июля 2012, 20:25 |
|
| |
TimKruz | Дата: Четверг, 05 Июля 2012, 20:44 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| IL-98-YA, если хочешь написать бота за пару минут, задумываясь не над лишними мелочами типа WinAPI, а только над алгоритмом, используй AutoIt. Это бесплатная такая штука, позволяет писать программки на собственном скриптовом языке, с очень удобными функциями для автоматизации многих задач в Windows, типа кликов, нужных нажатий клавиш и тому подобного (хотя можно писать с собственным GUI, там возможностей много). Плюс можно подсоединить DLL AutoIt'а к любому другому языку программирования, чтобы использовать функции AutoIt... Если умеешь программировать вообще, то в AutoIt разобраться легче легкого, хотя всё на английском... Quote (Нохчи) PostMessage(HWND_BROADCAST, WM_KEYDOWN, сканкод_клавиши, 0) По-моему эта команда отправит сообщение всем окнам сразу, а нужно только окну, имеющему фокус... А потом нужно отправить ещё WM_KEYUP...
|
|
| |
Нохчи | Дата: Четверг, 05 Июля 2012, 20:46 | Сообщение # 9 |
заслуженный участник
Сейчас нет на сайте
| Quote (TimKruz) По-моему эта команда отправит сообщение всем окнам сразу, а нужно только окну, имеющему фокус... А потом нужно отправить ещё WM_KEYUP... Да, или придется искать хэндл нужного окна.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |