Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Song @ 11.8.2005, 11:29)
Отжать кнопку тоже надо.

мне кажеться не надо

Автор: ФЫГ 12.8.2005, 10:14
dsergey
Код

var keyevents:array of tagINPUT;
...
SetLength(keyEvents,2);
keyevents[0].Itype := INPUT_KEYBOARD;
with keyevents[0].ki do begin
       wVk := VK_ENTER;
       wScan := MapVirtualKey(VK_ENTER, 0);
       dwFlags := 0;
       time := 0;
       dwExtraInfo := 0;
end;
keyevents[1]:=keyevents[0];
keyevents[1].ki.dwFlags:=KEYEVENTF_KEYUP;
SetForegroundWindow(handle);
SendInput(Length(keyevents), keyevnts[0], SizeOf(tagINPUT));
SetForegroundWindow(prevhandle);

другого способа нет.
читай 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
Всё равно не помогает, всмысле я программу скомпилировал, но фокус всё равно не возвращаеться, возвращаеться только моей программе(если она была активна)...

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