Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.097 c
1-1109008417
ТехникПТО
2005-02-21 20:53
2005.03.06
Real в String


14-1108573651
Pat
2005-02-16 20:07
2005.03.06
Мир Interbase 3-е издание


14-1108377909
}|{yk
2005-02-14 13:45
2005.03.06
Здоровеньки булы! И что тут без меня творилось? :)


14-1108290333
Луарвик
2005-02-13 13:25
2005.03.06
SQLConnection и не только


3-1107361560
salexn
2005-02-02 19:26
2005.03.06
утилита для работы с MSSQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский