| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Нажатие кнопки клавиатуры в другом приложении |
| Автор: l0k1 11.8.2005, 09:34 |
| Здраствуйте. Пытаюсь отправить программно нажатие кнопки на клавиатуре в другое приложение, но почему-то ничего не получаеться, отправляю вот таким способом: SendMessage(Handle_, WM_KEYDOWN, VK_RETURN,0); приложение - чат, в котором по ентеру происходит отправка сообщения. |
| Автор: Akella 11.8.2005, 10:34 |
| наверное, нужно вначале выполнить поиск главного окна findWindow(nil,'заголовок чата'), а затем выполнить поиск дочернего окна EnumChildWindows |
| Автор: Song 11.8.2005, 11:29 |
| l0k1 Отжать кнопку тоже надо. |
| Автор: Akella 12.8.2005, 09:37 | ||
мне кажеться не надо |
| Автор: ФЫГ 12.8.2005, 10:14 | ||
dsergey
другого способа нет. читай msdn |
| Автор: l0k1 16.8.2005, 15:05 |
| Пасибо, последний способ помог, но появилась ещё одна трабла. после SetForegroundWindow мы переключаемся в другое окно и посылаем клавиши, но следующий вызов SetForegroundWindow не даёт нужного эфекта, то есть даёт, но отчасти. Когда активно окно с моей программой, управление возвращаеться и оно вновь становиться активным, но как только я активизирую левое приложение(например тотал командер) это приложение просто теряет фокус, т.е. становиться неактивным. То есть получаеться последний SetForegroundWindow при левом приложение не работает. Я думал что это проблемы адресации в памяти и вывел все функции в отдельный dll, но это не помогло. Так-же я пробовал заменить getActiveWindow на GetFocus, а также SetForegroundWindow на SetActiveWindow и SetFocus, но это тоже не дало эфекта. Моё предположение в том что приложение не может получить хендл из вне, когда оно не активно, думка конечно дебильная, но больше просто ничего в голову не лезет... Возможно стоит написать HOOK на все изменения активности окон в системе, но имхо для той мелкой тулзы которую я пишу, это будет маразмом... ПОМОГИТЕ plzzz СОВЕТОМ каким образом востановить активность окна. З.Ы. Программа которую я пишу должна работать в бэкграунде, как и чат. То есть пользователь не должен замечать их работы, но я допускаю мелкие задержки(Например, при наборе текста в ворде, на время работы функции по нажатии ентера, система не успеет передать ворду нажатие клавиши). |
| Автор: Girder 16.8.2005, 15:09 |
| AttachThreadInput PS: Пример приводил. |
| Автор: ФЫГ 17.8.2005, 10:00 |
| l0k1 tmp:=0; SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,null,@tmp,null); |
| Автор: l0k1 19.8.2005, 12:48 |
| Извините, а что за ошибка: "Could not convert variant of type(NULL) into type(INT64)" Использую функцию предложенную ФЫГом, так как AttachThreadInput немного непонял как использовать. пробовал tmp обьявить и как Variant и как Int64, не помогает... З.Ы. не подскажите хороший оффлайн справочник по WinApi на русском, у меня есть один, вот только ему уже 5 лет и функции которые описаны в этой теме автор умудрился не добавить... |
| Автор: ФЫГ 20.8.2005, 09:18 |
| ну попробуй так SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,0,@tmp,nil); [/quote] |
| Автор: l0k1 22.8.2005, 17:07 |
| Всё равно не помогает, всмысле я программу скомпилировал, но фокус всё равно не возвращаеться, возвращаеться только моей программе(если она была активна)... |