Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 407

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Пробовал имитировать нажатие клавиш, в блокноте всё печатается, в нужном приложение, нет((
Гуглил, нашёл что это возможно из-за того что приложение использует directX
Подскажите пожалуйста есть ли альтернатива keybd_event? Если есть, то как это осуществить чтоб работала во всех приложениях(программах)

  keybd_event($09, 0, 0, 0); //Нажатие TAB.
  keybd_event($09, 0, KEYEVENTF_KEYUP, 0); //Отпускание TAB.
 
   //Пауза.
  Application.ProcessMessages;
  Sleep(StrToInt(Edit3.Text));
 
 //Ввод '1'
  keybd_event($31, 0, 0, 0); //Нажатие '1'.
  keybd_event($31, 0, KEYEVENTF_KEYUP, 0); //Отпускание '1'.
 
  //Пауза 
  Application.ProcessMessages;
  Sleep(StrToInt(Edit4.Text));
 
  //Ввод '2'
  keybd_event($32, 0, 0, 0); //Нажатие '2.
  keybd_event($32, 0, KEYEVENTF_KEYUP, 0); //Отпускание '2'.
 
  //Пауза.
  Application.ProcessMessages;
  Sleep(StrToInt(Edit5.Text));
 
  //Ввод '3'
  keybd_event($33, 0, 0, 0); //Нажатие '3'.
  keybd_event($33, 0, KEYEVENTF_KEYUP, 0); //Отпускание '3'.
 
  //Пауза.
  Application.ProcessMessages;
  Sleep(StrToInt(Edit6.Text));

nirlog Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: nirlog (статус: Посетитель)
Вопрос отправлен: 14 июня 2011, 06:55
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Gooddy

Здравствуйте, nirlog!
Можно попробовать отсылать сообщения в определённое окно. Тогда можно будет посылать клавиши даже в окно не имеющее фокуса!
Сам года два назад делал такое для WoW, но исходники утеряны.

Приложение:
  1. var
  2. wnd: HWND;
  3. i: Integer;
  4. s: string;
  5. begin
  6.  
  7. if wnd <> 0 then
  8. begin
  9. s := 'Hello';
  10. for i := 1 to Length(s) do
  11. SendMessage(wnd, WM_CHAR, Word(s[i]), 0);
  12. end;
  13. end;


Ответ отправил: Gooddy (статус: 3-ий класс)
Время отправки: 14 июня 2011, 17:43
Оценка за ответ: 3

Комментарий к оценке: не заработало, программа запускается но ничего не происходит. Вопрос открыт!

Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 17 июня 2011, 15:16; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 14 июня 2011, 08:29 [#1]:

А чо за приложение-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 14 июня 2011, 09:57 [#2]:

Вполне может быть, что приложение "сопротивляется" эмуляции нажатий клавиш. Особенно, если это какой-нибудь LA2 или CS.
Галочка "подтверждения прочтения" - вселенское зло.
nirlog

nirlog (статус: Посетитель), 14 июня 2011, 11:32 [#3]:

приложение на подобии LA2, из того что может там мешать это только GG(GameGuard)
вожможно ли это осуществить через SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke()?
Вадим К

Вадим К (статус: Академик), 14 июня 2011, 11:43 [#4]:

Ну подумайте, зачем там GameGuard? думаете это писали простаки?
Я знаю только один дешевый и хороший способ симулировать набор на клавиатуре - это обычный человек.

Вывод, симулировать, думаю можно, но это достаточно сложная задача. Лучше просто перестать играть в игры или играть по честному.
Галочка "подтверждения прочтения" - вселенское зло.
nirlog

nirlog (статус: Посетитель), 14 июня 2011, 12:51 [#5]:

т.е такая задача вам не посилам?
Есть ещё два варианта DirectInput и SimulateKeystroke(), но не смог найти ничего путного про то как это использовать, может хотя бы подскажите где можно найти инфу про них


экранная клавиатура там работает, значит это реально сделать
Вадим К

Вадим К (статус: Академик), 14 июня 2011, 13:25 [#6]:

Думаю по силам, вот только винду вначале придется поставить:) Потом делфи и неведомую игрушку.
Хотя есть экранная клавиатура работает, то вполне и приведенный выше пример должен работать, просто нужно знать, кому отправлять данные. А если слать на бум, то конечно, ничего работать не будет.
Галочка "подтверждения прочтения" - вселенское зло.
Gooddy

Gooddy (статус: 3-ий класс), 14 июня 2011, 17:51 [#7]:

Извиняюсь, не тот код послал!
procedure sendKeys( SomeText: string  );
var
  TI: TInput;
  KI: TKeybdInput;   
  I: Integer;   
begin
  TI.Itype := INPUT_KEYBOARD;   
  for I := 1 to Length(SomeText) do  
  begin  
    KI.wVk := Ord(UpCase(SomeText[I]));   
    KI.dwFlags := 0;   
    TI.ki := KI;   
    SendInput(1, TI, SizeOf(TI));   
    KI.dwFlags := KEYEVENTF_KEYUP;   
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    sleep(10);   
  end;   
end;

Но посылает только в активное окно.
Чисти код! Чисти код! Чисти код!
nirlog

nirlog (статус: Посетитель), 15 июня 2011, 11:22 [#8]:

киньте ссылку на модуль sendkeys
nirlog

nirlog (статус: Посетитель), 16 июня 2011, 19:26 [#9]:

Мучался, мучался с sendkeys, вроде запускается, но ничего не делает(((
вышло следущее:

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SendKey;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  TI: TInput;
  KI: TKeybdInput;
  I: Integer;
  SomeText: string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  TI.Itype := INPUT_KEYBOARD;
  for I := 1 to Length(SomeText) do
  begin
    KI.wVk := Ord(UpCase(SomeText[I]));
    KI.dwFlags := 0;
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    KI.dwFlags := KEYEVENTF_KEYUP;
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    sleep(10);
  end;
end;
 
end.
поправь если что-то не так

изначальная версия у меня даже запускаться не хотела

procedure sendKeys( SomeText: string  );
var
  TI: TInput;
  KI: TKeybdInput;   
  I: Integer;   
begin
  TI.Itype := INPUT_KEYBOARD;   
  for I := 1 to Length(SomeText) do  
  begin  
    KI.wVk := Ord(UpCase(SomeText[I]));   
    KI.dwFlags := 0;   
    TI.ki := KI;   
    SendInput(1, TI, SizeOf(TI));   
    KI.dwFlags := KEYEVENTF_KEYUP;   
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    sleep(10);   
  end;   
end;

выдавало кучу ошибок постоянно придирался к
procedure sendKeys( SomeText: string  );
и к
for I := 1 to Length(SomeText) do
nirlog

nirlog (статус: Посетитель), 17 июня 2011, 14:02 [#10]:

выдаёт ошибку
Undeclared identifier: 'SomeText'
в строке
for I := 1 to Length(SomeText) do
nirlog

nirlog (статус: Посетитель), 17 июня 2011, 15:16 [#11]:

unit Key;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, sndkey32, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
var
  TI: TInput;
  KI: TKeybdInput;
  I: Integer;
  SomeText: string;
 
begin
  TI.Itype := INPUT_KEYBOARD;
  for I := 1 to Length(SomeText) do
  begin
    KI.wVk := Ord(UpCase(SomeText[I]));
    KI.dwFlags := 0;
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    KI.dwFlags := KEYEVENTF_KEYUP;
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    sleep(1000);
  end;
end;
end.
вот что получилось, толку 0, запускается но ничего не происходит

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.04 сек.