Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

Эмитация нажатия клавиши на клавиатуре   Найти похожие ветки 

 
Norny   (2005-01-13 18:09) [0]

Не подскажете чайнику?


 
Игорь Шевченко ©   (2005-01-13 18:14) [1]

keybd_event


 
Eraser ©   (2005-01-13 20:23) [2]

Нужно использовать ловушки.


 
Kerk ©   (2005-01-13 20:31) [3]

Eraser ©   (13.01.05 20:23) [2]
не нужно. попробуй прочитать вопрос.


 
Eraser ©   (2005-01-13 21:10) [4]

Kerk ©
В смысле?
У меня в двухтомнике "Руководство разработчика" Тестейра, Пачеко (очень авторитетная книга) приведён хороший пример программы для иммитации нажатия клавишь, там всё через hook"и...


 
Piter ©   (2005-01-13 23:26) [5]

Вопрос: как эмулировать нажатие клавиши или кнопки мыши

Ответ:

1) Для мыши:

procedure MouseClick(Pt: TPoint; BackCursor: boolean = True);

  // Переводим экранные координаты к принятым в mouse_event
  function ScreenToAbsolute(const Pt: TPoint): TPoint;
  begin
    Result.x := Round(Pt.x * 65535 / Screen.Width);
    Result.y := Round(Pt.y * 65535 / Screen.Height);
  end;

var
 OldPt: TPoint;
begin
  if BackCursor then
    OldPt := ScreenToAbsolute(Mouse.CursorPos);
  Pt := ScreenToAbsolute(Pt);
  {Переместим курсор мыши}
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
  {Нажамаем левую кнопку мыши}
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
  {Отпускаем левую кнопки мыши}
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
  if BackCursor then
    {Перемещаем кнопку мыши обратно}
    Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, OldPt.x, OldPt.y, 0, 0);
end;


Например поместим на форму две кнопки Button1 и Button2 и в их обработчиках напишем следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage("Test");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MouseClick(Button1.ClientToScreen(Point(2, 2)), True); // Кликаем по первой кнопке..
end;


2) Для клавиатуры

procedure PressKey(Key: byte); //Key - virtual-key code
begin
keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;


Пример использования:

procedure TForm1.Button2Click(Sender: TObject);
begin
 PressKey(ord("G"));
end;


Это эквивалентно нажатию клавиши "g" на клавиатуре. Только не забудьте, что, например, в текстовом поле напечатанный символ будет зависеть от текущей раскладки ("g" при английской раскладке, "п" - при русской). Чтобы напечатать заглавную букву можно сэмулировать нажатие SHIFT, потом нажатие нужной буквы, потом отпускание SHIFT"а:

keybd_event(VK_SHIFT, 0, 0, 0);
... //нажатие нужной клавиши
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);


И не забывайте, что CapsLock может изменить поведение SHIFT"а наоборот.

Отвечал: Jack128


 
Piter ©   (2005-01-13 23:27) [6]

Eraser ©   (13.01.05 21:10) [4]

бред какой-то. Каким образом хуками можно имитировать нажатия клавиш?


 
Kerk ©   (2005-01-14 04:43) [7]

Eraser ©   (13.01.05 21:10) [4]
что книга авторитетная согласен. но уверен, ты путаешь. иначе - код в студию. думаю, всем будет интересно.


 
Вариант ©   (2005-01-14 22:06) [8]

А SendKeys не подходит?
http://delphibase.endimus.ru/?action=viewfunc&topic=sysiface&id=10242

Если тебе нужно эмулировать нажатия клавиши, то это самое то!


 
Eraser ©   (2005-01-15 02:54) [9]

Piter ©
Kerk ©

Специально достал книгу и проверил!!!
"Существует несколько причин, по которым ловушку следует считать лучшим способом иммитации клавишь в приложении. Вы можете спросить:""А почему бы просто не отправить сообщение wm_keyDown и wm_KeyUp?" Основная причина в том, что вы можете не знать дескриптор окна, которому хотите отправить сообщение, или же дескриптор этого окна может  переодически изменяться......."
Надоело перепечатывать книгу ;)))
Короче используется ловушка JournalPlayBack. Сначала создаётся список сообщении, а потом передаётся этой ловушке. Точно ринципа работы не помню- забыл, года 2 назад когда был интерес разобрался, а сейчас лень опять в довольно объёмном коде разбираться.
Короче кому интересно- поищите в сети, эта книга есть по-моему и в эл. виде.
Авторы: Стив Тейксейра и Ксавье Пачеко.


 
Kerk ©   (2005-01-15 07:14) [10]

Eraser ©   (15.01.05 2:54) [9]
ты дай код.. или укажи название главы, где это.


 
VMcL ©   (2005-01-15 09:52) [11]

>>Eraser ©  (15.01.05 02:54) [9]

>Основная причина в том, что вы можете не знать дескриптор окна, которому хотите отправить сообщение, или же дескриптор этого окна может  переодически изменяться.......

Смотрю декларацию keybd_event() и mouse_event() и не вижу никаких дескрипторов окон. Итак ещё раз: зачем в таком случае усложнять себе жизнь ловушкой? :o)


 
Piter ©   (2005-01-15 17:44) [12]

Вероятно, имелась в виду эмуляция нажатия клавиши в определенном приложении. То есть, даже если приложение не активно, например


 
Kerk ©   (2005-01-15 17:46) [13]

Piter ©   (15.01.05 17:44) [12]
хендл все равно знать придется


 
Eraser ©   (2005-01-16 18:09) [14]

Kerk ©
В 1 томе, глава про ловушки.
VMcL ©
Смотрю декларацию keybd_event() и mouse_event() и не вижу никаких дескрипторов окон. Итак ещё раз: зачем в таком случае усложнять себе жизнь ловушкой? :o)

Ловушка передаёт сообщение о нажатии клавиши в очередь сообщений определённого окна.


 
Vaitek ©   (2005-01-16 21:32) [15]

Только что проверил, keybd_event() - работает. А как туда в качестве параметра пердать например Alt-1 ?


 
MR. Exx   (2005-01-16 22:47) [16]

Работает только на активном окне:

procedure SetKey(Key:Integer);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;


 
Vaitek ©   (2005-01-17 19:39) [17]

Короче, я торомоз. Сорри за глупый вопрос.


 
Piter ©   (2005-01-17 19:44) [18]

MR. Exx   (16.01.05 22:47) [16]
Работает только на активном окне


а нажатие клавиш на клавиатуре разве не в активном окне работает? :)


 
novill   (2005-01-19 11:12) [19]

Подскажите scan code кнопки шифт (левого и правого)

нужно для исользования

VOID keybd_event(

   BYTE bVk, // virtual-key code
   BYTE bScan, // hardware scan code
   DWORD dwFlags, // flags specifying various function options
   DWORD dwExtraInfo  // additional data associated with keystroke
  );


 
novill   (2005-01-19 11:15) [20]

Или можно 0 ставить?


 
Piter ©   (2005-01-19 18:37) [21]

novill   (19.01.05 11:12) [19]
Подскажите scan code кнопки шифт (левого и правого)


а зачем тебе шифт? Ты кстати вообще читать умеешь?

Piter ©   (13.01.05 23:26) [5]
Чтобы напечатать заглавную букву можно сэмулировать нажатие SHIFT, потом нажатие нужной буквы, потом отпускание SHIFT"а:

keybd_event(VK_SHIFT, 0, 0, 0);
... //нажатие нужной клавиши
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

И не забывайте, что CapsLock может изменить поведение SHIFT"а наоборот.


 
alpet   (2005-01-20 11:58) [22]

Под XP лучше всего напрямую использовать SendInput. Замечу что все равно не удается иммитировать такие сочетания как Win+R, а также управлять DOS приложениями.



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.066 c
3-1107415989
Маугли
2005-02-03 10:33
2005.03.06
Crystall Report


3-1107773889
КаПиБаРа
2005-02-07 13:58
2005.03.06
Запись данных в базу вотдельном потоке. (первый раз делаю)


1-1108988485
ASH
2005-02-21 15:21
2005.03.06
RTTI + DLL


14-1108296080
_RusLAN
2005-02-13 15:01
2005.03.06
Delphi 2005 CD3. Что он содержит


1-1109081180
Топпер
2005-02-22 17:06
2005.03.06
освобождение немодальных форм