| 
| 
 | Вопрос # 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 (статус: Посетитель)Вопрос отправлен: 14 июня 2011, 06:55
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Gooddy Здравствуйте, nirlog!Можно попробовать отсылать сообщения в определённое окно. Тогда можно будет посылать клавиши даже в окно не имеющее фокуса!
 Сам года два назад делал такое для WoW, но исходники утеряны.
 Приложение:Переключить в обычный режим  var     wnd: HWND;      i: Integer;      s: string;    begin      if wnd <> 0 then     begin       s := 'Hello';        for i := 1 to Length(s) do         SendMessage(wnd, WM_CHAR, Word(s[i]), 0);      end;    end;   
|  | Ответ отправил: Gooddy (статус: 3-ий класс)Время отправки: 14 июня 2011, 17:43
 Оценка за ответ: 3
 Комментарий к оценке: не заработало, программа запускается но ничего не происходит. Вопрос открыт! |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 17 июня 2011, 15:16; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 14 июня 2011, 08:29 [#1]:А чо за приложение-то? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 14 июня 2011, 09:57 [#2]:Вполне может быть, что приложение "сопротивляется" эмуляции нажатий клавиш. Особенно, если это какой-нибудь LA2 или CS. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | nirlog (статус: Посетитель), 14 июня 2011, 11:32 [#3]:приложение на подобии LA2, из того что может там мешать это только GG(GameGuard) вожможно ли это осуществить через SimulateKeyDown(), SimulateKeyUp() и SimulateKeystroke()?
 |  
|   | Вадим К (статус: Академик), 14 июня 2011, 11:43 [#4]:Ну подумайте, зачем  там GameGuard? думаете это писали простаки? Я знаю только один дешевый и хороший способ симулировать набор на клавиатуре - это обычный человек.
 
 Вывод, симулировать, думаю можно, но это достаточно сложная задача. Лучше просто перестать играть в игры или играть по честному.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | nirlog (статус: Посетитель), 14 июня 2011, 12:51 [#5]:т.е такая задача вам не посилам? Есть ещё два варианта DirectInput и SimulateKeystroke(), но не смог найти ничего путного про то как это использовать, может хотя бы подскажите где можно найти инфу про них
 
 
 экранная клавиатура там работает, значит это реально сделать
 |  
|   | Вадим К (статус: Академик), 14 июня 2011, 13:25 [#6]:Думаю по силам, вот только винду вначале придется поставить  Потом делфи и неведомую игрушку. Хотя есть экранная клавиатура работает, то вполне и приведенный выше пример должен работать, просто нужно знать, кому отправлять данные. А если слать на бум, то конечно, ничего работать не будет.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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 (статус: Посетитель), 15 июня 2011, 11:22 [#8]:киньте ссылку на модуль sendkeys |  
|   | 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 (статус: Посетитель), 17 июня 2011, 14:02 [#10]:выдаёт ошибку Undeclared identifier: 'SomeText'
 в строке
 for I := 1 to Length(SomeText) do
 |  
|   | 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, запускается но ничего не происходит |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |