Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 17:49   #1
Sergeu
Пользователь
 
Аватар для Sergeu
 
Регистрация: 23.08.2008
Сообщений: 60
По умолчанию виртуально нажать на клавишу

Народ помогите надо чтоб моя прога виртуально нажала на рускую букву "Т" в другой проге (Игре). в поиске поискал нашол вот такой код но он не роботает
Цитата:
keybd_event(ord('Т'),0,0,0);
keybd_event(ord('Т'), 0, KEYEVENTF_KEYUP, 0);
- Я фармацевт.
- А, значит в аптеке работаете.
- Нет, диск С форматирую.
Sergeu вне форума Ответить с цитированием
Старый 25.05.2009, 17:54   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... а что означает "в другой проге"..?

Может сначала нужно передать фокус окну игры..?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 25.05.2009, 18:03   #3
Sergeu
Пользователь
 
Аватар для Sergeu
 
Регистрация: 23.08.2008
Сообщений: 60
По умолчанию

фокус есть человек играет в эту игру в которой и надо виртуально нажимать на Т (просто для друга надо у него рук не хвотает на все кнопки!)
- Я фармацевт.
- А, значит в аптеке работаете.
- Нет, диск С форматирую.
Sergeu вне форума Ответить с цитированием
Старый 25.05.2009, 19:05   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Вот процедура:
Код:
procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
type
 TShiftKeyInfo = record
   shift: Byte;
   vkey: Byte;
 end;
 byteset = set of 0..7;
const
 shiftkeys: array [1..3] of TShiftKeyInfo =
   ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
   (shift: Ord(ssShift); vkey: VK_SHIFT),
   (shift: Ord(ssAlt); vkey: VK_MENU));
var
 flag: DWORD;
 bShift: ByteSet absolute shift;
 i: Integer;
begin
 for i := 1 to 3 do
 begin
   if shiftkeys[i].shift in bShift then
     keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
 end; { For }
 if specialkey then
   flag := KEYEVENTF_EXTENDEDKEY
 else
   flag := 0;

 keybd_event(key, MapvirtualKey(key, 0), flag, 0);
 flag := flag or KEYEVENTF_KEYUP;
 keybd_event(key, MapvirtualKey(key, 0), flag, 0);

 for i := 3 downto 1 do
 begin
   if shiftkeys[i].shift in bShift then
     keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
       KEYEVENTF_KEYUP, 0);
 end; { For }
end; { PostKeyEx32 }
Вот пример:
Код:
procedure TForm1.bt_1Click(Sender: TObject);
var
 s: TShiftState;
begin
 Edit1.SetFocus;
 Edit1.SelectAll;
 PostKeyEx32(Ord('T'), s, false);
end;
И вообще посмотрите мой исходник во вложении
Там присваиваются другие комбинации клавиш цифрам от 0 до 9 на клавиатере
Например единице можно присвоить Alt+F4
Вложения
Тип файла: rar Симуляция клавиш.rar (367.8 Кб, 29 просмотров)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 25.05.2009, 19:41   #5
Sergeu
Пользователь
 
Аватар для Sergeu
 
Регистрация: 23.08.2008
Сообщений: 60
По умолчанию

он не печатает а стерает! виртуально нажимаеться не т а DEl
- Я фармацевт.
- А, значит в аптеке работаете.
- Нет, диск С форматирую.

Последний раз редактировалось Sergeu; 25.05.2009 в 19:48.
Sergeu вне форума Ответить с цитированием
Старый 25.05.2009, 19:53   #6
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Я же перед вызовом выделил весь текст:
Код:
Edit1.SelectAll;
Понятно стирать будет.
Если добавлять, то так:
Код:
procedure TForm1.bt_1Click(Sender: TObject);
var
 s: TShiftState;
begin
 Edit1.SetFocus;
 Edit1.SelText := Edit1.Text;
 PostKeyEx32(Ord('T'), s, false);
end;
Вы скачайте исходник, который я приложил, там то что вам нужно.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 25.05.2009, 19:58   #7
Sergeu
Пользователь
 
Аватар для Sergeu
 
Регистрация: 23.08.2008
Сообщений: 60
По умолчанию

да в Edit1 он добовляет и печатает т а в любом текстовом документе (блакноте например) он стирает текст тоесть всё ровно нажимаеться DEL
З.ы. мне не нужен Edit на форме!
- Я фармацевт.
- А, значит в аптеке работаете.
- Нет, диск С форматирую.
Sergeu вне форума Ответить с цитированием
Старый 25.05.2009, 20:09   #8
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Вот пример кода, если вы уж не хотите качать исходник и тем более в нем разбираться:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    bt_1: TButton;
    bt_2: TButton;
    procedure bt_1Click(Sender: TObject);
    procedure bt_2Click(Sender: TObject);
  private
    { Private declarations }
    //Обрабатываем нажатие клавиш
    procedure WMHotKey(var Msg: TMessage); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
type
 TShiftKeyInfo = record
   shift: Byte;
   vkey: Byte;
 end;
 byteset = set of 0..7;
const
 shiftkeys: array [1..3] of TShiftKeyInfo =
   ((shift: Ord(ssCtrl); vkey: VK_CONTROL),
   (shift: Ord(ssShift); vkey: VK_SHIFT),
   (shift: Ord(ssAlt); vkey: VK_MENU));
var
 flag: DWORD;
 bShift: ByteSet absolute shift;
 i: Integer;
begin
 for i := 1 to 3 do
 begin
   if shiftkeys[i].shift in bShift then
     keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
 end; { For }
 if specialkey then
   flag := KEYEVENTF_EXTENDEDKEY
 else
   flag := 0;

 keybd_event(key, MapvirtualKey(key, 0), flag, 0);
 flag := flag or KEYEVENTF_KEYUP;
 keybd_event(key, MapvirtualKey(key, 0), flag, 0);

 for i := 3 downto 1 do
 begin
   if shiftkeys[i].shift in bShift then
     keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
       KEYEVENTF_KEYUP, 0);
 end; { For }
end; { PostKeyEx32 }

//Регистрация клавиши '1' на клавиатуре для нашей программы
procedure TForm1.bt_1Click(Sender: TObject);
begin
 RegisterHotKey(Handle, Ord('1'), 0, Ord('1'));
end;

//Убираем регистрацию клавиши '1' на клавиатуре
procedure TForm1.bt_2Click(Sender: TObject);
begin
 UnregisterHotKey(Handle, Ord('1'));
end;

//При уничтожении формы тоже убираем регистрацию
procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnregisterHotKey(Handle, Ord('1'));
end;

procedure TForm1.WMHotKey(var Msg: TMessage);
var
 s: TShiftState;
begin
 if Chr(Msg.WParam) = '1' then  //Если нажатая клавиша равна 1
  PostKeyEx32(Ord('T'), s, false);  //нажимаем T
end;

end.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.

Последний раз редактировалось Neeter; 25.05.2009 в 20:13.
Neeter вне форума Ответить с цитированием
Старый 25.05.2009, 20:28   #9
Sergeu
Пользователь
 
Аватар для Sergeu
 
Регистрация: 23.08.2008
Сообщений: 60
По умолчанию

я уже ни чего не понимаю но всё равно симулираеца нажатие Del а не Т вот мой проект может посмотрите и скажите в чём проблема я повторю что мне надо ---- мне надо чтоб эта прога самма эмулирова ла нажатие клавиши Русской Т в другой программе (игре)
Вложения
Тип файла: zip Team forterss 2 tiam v 1.0.zip (813.7 Кб, 12 просмотров)
- Я фармацевт.
- А, значит в аптеке работаете.
- Нет, диск С форматирую.
Sergeu вне форума Ответить с цитированием
Старый 25.05.2009, 20:40   #10
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Вот:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 RegisterHotKey(Handle, Ord('1'), 0, Ord('1'));
 label1.Caption:='Бот запущен!!!';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 UnregisterHotKey(Handle, Ord('1'));
 label1.Caption:='Бот остановлен!!!';
end;
А Timer1 совсем удалите
Хотя у меня работало и как у вас было.

Еще, вы сказали что вам нужна русская Т, значит замените:
Код:
procedure TForm1.WMHotKey(var Msg: TMessage);
var
 s: TShiftState;
begin
 if Chr(Msg.WParam) = '1' then  //Если нажатая клавиша равна 1
  PostKeyEx32(Ord('N'), s, false);  //нажимаем T
end;
Потому что с русской чего то не работает. А на N английскую должен реагировать.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие на клавишу 3.14oner Паскаль, Turbo Pascal, PascalABC.NET 1 14.07.2008 17:14
связать клавишу с кнопочкой Voucik Общие вопросы .NET 1 01.03.2008 19:30
Как программно нажать клавишу в чужом процессе? Sere0ga Win Api 2 27.03.2007 18:43