Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Эмитация нажатия клавиши на клавиатуре


Страницы:   1 2

Norny ©   (2005-01-13 18:09:00) 

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


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

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


Piter   (2005-01-19 18:37:00) [2]

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'а наоборот.


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

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


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

Подскажите 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
  );


Piter   (2005-01-17 19:44:00) [5]

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


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


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

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


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

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

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-16 21:32:00) [8]

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


Eraser   (2005-01-16 18:09:00) [9]

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

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


Kerk   (2005-01-15 17:46:00) [10]

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


Piter   (2005-01-15 17:44:00) [11]

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


VMcL   (2005-01-15 09:52:00) [12]

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

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

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


Kerk   (2005-01-15 07:14:00) [13]

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


Eraser   (2005-01-15 02:54:00) [14]

Piter ©
Kerk ©

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


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

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

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


Kerk   (2005-01-14 04:43:00) [16]

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


Piter   (2005-01-13 23:27:00) [17]

Eraser ©   (13.01.05 21:10) [4]

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


Piter   (2005-01-13 23:26:00) [18]

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

Ответ:

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


Eraser   (2005-01-13 21:10:00) [19]

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо