| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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-ые, проверить не могу... |