| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Послать клавишу и вернуться |
| Автор: Skiminok 22.5.2006, 15:32 |
| Требуется несколько раз эмулировать нажатия клавиши в другой программе. Для этого я использовал код из FAQ, но есть некоторая проблема. Данный код обновляет то окно, которое в данный момент является активным. Поэтому мне требуется разрешить такую проблему: определить, какое окно сейчас является активным, послать клавишу (AppActivate и SendKeys) и вернуться в то же окно. GetActiveWindow не помогает. Заранее спасибо. З.Ы. Если уж на то пошло, можете ли, пожалуйста, объяснить, как с помощью SendMessage посылать клавиши, не имеющие ASCII-кода? Это может решить проблему. Заранее ещё одно спасибо. |
| Автор: Snowy 22.5.2006, 15:49 |
| GetForegroundWindow по виртуальному коду. (VK_UP, например) |
| Автор: Yanis 22.5.2006, 15:52 |
| Что за клавиши такие? Используй GetForegroundWindow Что значит "вернуться"? Добавлено @ 15:57 Про ASCII стормозил. Извиняюсь. |
| Автор: Skiminok 23.5.2006, 14:45 | ||||
А какие добавочные два параметра передавать в SendMessage?
При посылке окно автоматически становится активным. Мне требуется вернуться, т.е. сделать активным окно, бывшее активным до того. |
| Автор: vv3 24.5.2006, 10:55 | ||||||
| function SendMessage(Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint; Wnd - хэндл окна, которому посылается сообщение ($FFFF - послать сообщение всем окнам системы) Msg - тип сообщения (в твоем случае либо WM_KEYDOWN, либо WM_KEYUP, либо WM_CHAR) wParam - дополнительная информация о сообщении (в твоем случае код клавиши или ASCII) lParam - дополнительная информация о сообщении (в твоем случае - 0, сообщения-то бывают разные) Таким образом, чтобы нажать в чужом окне F1, ты пишешь что-то вроде:
Чтобы отослать чужому окну Backspace и он отработал свое действие, т.е. вставил #8:
И, наконец, чтобы вставить в чужое окно 15 символов Ё пишем:
Кстати, зачем выносить окно в Foreground, чтобы отослать ему сообщение и опять тут же спрятать? Ведь твое приложение, отослав сообщение, ждать не будет, пойдет работать дальше. А окно и без активации сообщение принять должно. |
| Автор: BinaryEvil 24.5.2006, 13:09 |
| SendMessage никатит, нада SendInput если XP, и keybd_event если 98. |
| Автор: vv3 24.5.2006, 17:43 | ||
Да неужто? А у меня что стоит? 3.11 For Workgroup? Итак, запускаем Блокнот, например... И Дельфи (тоже например и пишем такое:
Кликаем по кнопочке Button1 и наслаждаемся тем, что не катит... |
| Автор: Yanis 24.5.2006, 18:30 |
| От себя добавлю, что лучше использовать PostMessage или SendMessageTimeout, т.к. программа чужая и что с ней может случиться не предугадать... |
| Автор: BinaryEvil 24.5.2006, 20:41 | ||
лиха ты... умный...у мя чёта ниработаит... отета:
работает без проблем Добавлено @ 20:42 у мя xp |
| Автор: Skiminok 24.5.2006, 22:35 | ||
А если я, к примеру, шлю F5 в обычное окно Windows-браузера? Или просто в IE... |
| Автор: Skiminok 24.5.2006, 23:27 |
| BinaryEvil, не работает(на XP!). |
| Автор: Skiminok 25.5.2006, 14:48 |
| С обычным SendMessage... в принципе работает, но не совсем так, как надо - есть странные глюки. Попробую PostMessage. Тогда окно браузера становится активным. |
| Автор: Angel_19 2.6.2006, 09:08 |
| Уважаемые, а как послать комбинацию клавиш? Т.е. например Ctrl+Ins с помощью SendMesage ? |
| Автор: BinaryEvil 2.6.2006, 11:39 | ||
Angel_19, с помощью SendInput
работает на 100%, если нужное окно активно. если нет, то иногда не проходят нажатия, я ставлю задержку перед sendinput: WO := CreateEvent(nil, True, False, '');WaitForSingleObject(WO, 10);CloseHandle(wo); |