Среда, 18 Декабря 2024, 15:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как эмулировать клавиши посредством функции 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();
      }
          }
      }

код выше... почему не работает не знаю sad проверял на блокноте(по сути он должен начать писать фыв по одной букве в 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 отпадут, если посмотреть тут
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг