Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как симитировать нажатие клавиш


Автор: decoder 25.10.2004, 18:13
нажатие одной клавиши - эт элементарно:
PostMessage(Wnd, WM_KEYDOWN, Key, 0);
PostMessage(Wnd, WM_KEYUP, Key, 0);
А как ещё и Key + VK_SHIFT + VK_CONTROL симитировать? В lParam вроде состояние 256 клавиш поидее быть не должно...

Автор: VIY 26.10.2004, 09:12
Посмотри, может это поможет:

Как сделать имитацию ввода с клавиатуры для программы выполняющейся в DOS-окне

const

ExtendedKeys: set of Byte = [ // incomplete list
VK_INSERT, VK_DELETE, VK_HOME, VK_END, VK_PRIOR, VK_NEXT,
VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN, VK_NUMLOCK
];

procedure SimulateKeyDown(Key: byte);
var

flags: DWORD;
begin

if Key in ExtendedKeys then
flags := KEYEVENTF_EXTENDEDKEY
else
flags := 0;
keybd_event(Key, MapVirtualKey(Key, 0), flags, 0);
end;

procedure SimulateKeyUp(Key: byte);
var

flags: DWORD;
begin

if Key in ExtendedKeys then
flags := KEYEVENTF_EXTENDEDKEY
else
flags := 0;
keybd_event(Key, MapVirtualKey(Key, 0), KEYEVENTF_KEYUP or flags, 0);
end;

procedure SimulateKeystroke(Key: byte);
var

flags: DWORD;
scancode: BYTE;
begin

if Key in ExtendedKeys then
flags := KEYEVENTF_EXTENDEDKEY
else
flags := 0;
scancode := MapVirtualKey(Key, 0);
keybd_event(Key,
scancode,
flags,
0);
keybd_event(Key,
scancode,
KEYEVENTF_KEYUP or flags,
0);
end;


Автор: decoder 26.10.2004, 16:16
VIY, покажи, как симитировать, например, Ctrl+Shift+C пользуясь твоей программой (я так понял, симитировать нажатие двух клавиш одновременно твоя програ не может)...
А ваще, я уже свой вариант сделал, тока пока проверить не могу:
PostMessage(Wnd, WM_KEYDOWN, VK_CONTROL, 0);
PostMessage(Wnd, WM_KEYDOWN, VK_SHIFT, 0);
PostMessage(Wnd, WM_KEYDOWN, Ord('C'), 0);
PostMessage(Wnd, WM_KEYUP, Ord('C'), 0);
PostMessage(Wnd, WM_KEYUP, VK_SHIFT, 0);
PostMessage(Wnd, WM_KEYUP, VK_CONTROL, 0);
Скажите, работать будет?

Автор: VIY 27.10.2004, 10:43
нажатие CTRL+A

keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);

А, твои примеры у меня не заработали (правда в хелпе написано, мол 30-й бит у lParam надо ставить в 1, но честно говоря сколько пробовал не помогает)
(ЗЫ:Пробовал в DELPHI 5)


Автор: decoder 27.10.2004, 11:57
VIY, фактически, эт реализация моей идеи. Другое дело, почему с PostMessage не работает?..
На каких Виндах пробрвал?

Автор: Guest 27.10.2004, 13:40
WINDOWS 98

Автор: VIY 27.10.2004, 13:46
Сори за предыдущее сообщение.

Автор: JOHN_PROFF 27.10.2004, 14:17
http://www.lib.csu.ru/DL/bases/prg/frolov/books/bsp/v11/ch5.htm

Автор: VIY 27.10.2004, 15:55
Спасибо за ссылку.

Автор: Vit 3.11.2004, 17:37
Перенесенно из раздела Delphi: Общие вопросы

Автор: decoder 5.11.2004, 22:56
B msdn сказано, мол keybd_event XP заменён на SendInput. То есть, keybd_event работать не будет? У меня 98-ые, проверить не могу...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)