Проблема стоит такая - надо проэмулировать нажатия в
ДРУГОМ ПРИЛОЖЕНИИ
(handle известен).
Но не одиночных, а двойных (Shift+Insert или Ctrl+V,
например, я из
Clipboard-а вставляю информацию). Так вот, решение "в лоб"
через
postmessage не дает результатов - "функциональная" клавиша
не удерживается
:-(
"страшные" цифры в конце взяты из документации к WinAPI.
Различные
модификации 4-го параметра не помогают.
Если кто-то обладает готовым работающим решением, или
знает, как
"удержать" Shift (или CTRL), подскажите, пожалуйста!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
11-12-2003 03:26
ВОПРОС: КАК ПОСЛАТЬ ПРОГРАММЕ КОМБИНАЦИЮ КЛАВИШ,
НАПРИМЕР "CTRL+F"? ОТВЕТ: ДЕЛАЕМ СЛЕДУЮЩЕЕ:
01) Запустить WinSight;
02) Зайти в его настройки: Меню "Messages" --> "Options" ...;
03) В окне настроек ВКЛючить галочку "Interpret Values", а "HEX Values" - ВЫКЛючить. Нажать OK!;
04) Запустить программу-"пациента", которой мы хотим посылать комбинацию клавиш;
05) Выбрать в дереве процессов WinSight эту программу-"пациента" и тот ее объект, которому надо "посылать";
06) Включить WinSight в режим слежения: "Start!" и переключиться на программу-"пациента";
07) Активировать (если надо) нужный объект щелчком мыши и нажать требуемую комбинацию клавиш;
08) Должна выполниться та функция программы-"пациента", вызов которой мы хотим эмулировать программно;
09) Закрываем программу-"пациента" (не обязательно, можно свернуть ;-);
10) Переходим к WinSight и смотрим, какие сообщения он у нас поймал;
11) Если ничего нет (или нет того, что нужно), значит вы выбрали не тот процесс или объект программы.
Коли так, возвращайтесь к пункту 4 и делайте заново... Удачи...;
12) Если вы все-таки получили "какие то" сообщения и среди них попадаются слова WM_KEYDOWN,
значит, возможно, это то, что нужно... ;-);
13) Выбираем (визуально) участок сообщений, в котором содержатся сообщения WM_KEYDOWN
и/или WM_KEYUP. Например:
// Плюсами я мысленно пометил те сообщения, которые нужны (в моем случае) для эмуляции нажатия.
14) Отделите (мысленно) "мусор" от "нормальных", нужных сообщений (чтобы выбрать, можно прогнать
процесс отслеживания сообщений несколько раз и сравнить полученные результаты)
15) Допустим Вы получили список "нужных" сообщений, повторяющихся всегда при нажатии комбинации:
16) Далее, нужно зайти в настройки WinSight: Меню "Messages" --> "Options" ...
17) В окне настроек ВЫКЛючить галочку "Interpret Values", а "HEX Values" - ВКЛючить. Нажать OK! ;-)
Ваши сообщения преобразуются в несколько другой вид:
18) А вот это, девочки и мальчики - уже и есть готовые команды! Надо только переписать в Дельфю!
19) Преобразуем в нормальный Дельфевый вид:
// Эмуляция нажатия CTRL+F. ( HWND - соответственно хендл объекта, которому будем посылать комбинацию)
// PostMessage применяется, если сообщение Dispatched (см. выше - перехваченные сообщения)
// SendMessage применяется, если сообщение Sent (см. выше - перехваченные сообщения)
20) Вот собственно и все! Компилируйте, запускайте свою прогу, запускайте программу-"пациента" и проверяйте!
Если не работает, значит вы чего то не учли... Попробуйте еще поискать WinSight'ом... А у меня все работает!
Вот примерчик, который наверное вам подойдет.
(Взят из RBuilder)
procedure TppDesignerWindow.FileSaveFormClick(Sender: TObject);
var
lHandle : THandle;
lCtrlKey : TKeyData;
lSKey : TKeyData;
begin
{build control key data rec}
lCtrlKey.RepeatCount := 1;
lCtrlKey.ScanCode := MapVirtualKey(VK_CONTROL, 0);
lCtrlKey.Flags := 0;
{send Ctrl + S key stroke combo to delphi }
lHandle := FindWindow('TAppBuilder', nil);
if (lHandle > 0) then
begin
PostMessage(lHandle, WM_KEYDOWN, VK_CONTROL, LongInt(lCtrlKey));
PostMessage(lHandle, WM_KEYDOWN, Ord('S'), LongInt(lSKey));
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.