| Как эмулировать клавиши посредством функции 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 отпадут, если посмотреть тут
 |  |  |  |  |