![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Oтправить комбинацию Crtl+C [D7, Win2k, WinXP]
Rentgen © (2005-10-20 09:14:00)Всем привет!
Нужно отправить комбинацию клавишь в текстовое окно своей программы - Ctrl+C.
Делаю так:
PostMessage(HWND, WM_KEYDOWN, Ord('C'), MOD_CONTROL);
Посылается обычная 'c'
Хотя в результате нужно: ^C
//пробовал WM_KEYFIRST, SendMessage - таже проблема.
Что я делаю не так?
P.S.
Вручную комбинация работает и выдает: ^C
Ботвин Дмитрий (2005-10-20 12:51:00) [1]Если AdTerminal1.Handle - это хэндл окна, тогда пробуй так:
SetForegroundWindow(AdTerminal1.Handle);
// имитация нажатия клавиши Key
procedure PressKey(Key: Word);
begin
keybd_event(Key,0,0,0);
end;
// имитация отпускания клавиши Key
procedure ReleaseKey(Key: Word);
begin
keybd_event(Key,0,KEYEVENTF_KEYUP,0);
end;
// имитация щелчка на клавише Key
procedure ClickKey(Key: Word);
begin
keybd_event(Key,0,0,0);
keybd_event(Key,0,KEYEVENTF_KEYUP,0);
end
// нажатие Ctrl+C
PressKey(VK_CONTROL);
ClickKey(ord('C'));
ReleaseKey(VK_CONTROL);
Должно сработать :-)))
Rentgen (2005-10-20 12:43:00) [2]
> Ботвин Дмитрий (20.10.05 12:27) [9]
пробовал... (((((
Ботвин Дмитрий (2005-10-20 12:27:00) [3]Можно попробывать keybd_event, чаще всего помагает
Rentgen (2005-10-20 12:04:00) [4]
> ALL
Очень нужно!!!! Горю!!!
Rentgen (2005-10-20 11:46:00) [5]
> Ботвин Дмитрий (20.10.05 11:42) [6]
Если вы имеете в виду ставить паузу, то эт я пробовал.
тоже самое... :((((
Ботвин Дмитрий (2005-10-20 11:42:00) [6]Rentgen © (20.10.05 10:40) [3]
Посылать следующее сообщение нужно только после того, как поток
целевого окна обработал предыдущее. А где в коде
PostMessage(AdTerminal1.Handle, WM_KEYDOWN, VK_CONTROL , 0);
PostMessage(AdTerminal1.Handle, WM_KEYDOWN, ord('C'),0);
гарантия того, что PostMessage(AdTerminal1.Handle, WM_KEYDOWN, VK_CONTROL , 0)обработано к моменту посылки
PostMessage(AdTerminal1.Handle, WM_KEYDOWN, ord('C'),0).
Это не факт!!! Может быть из-за этого...
Rentgen (2005-10-20 11:12:00) [7]Когда-то написал программу:
AutoCheats ( http://autocheats.narod.ru)
Она симулирует нажатие клавиш (для игр делал - набирать коды)
дк вот там я точно неиспользовал 4 параметр так как [4]
и все же вопрос открыт.
umbra (2005-10-20 10:52:00) [8]Но ведь в lParam (четвертый аргумент) должен быть, наверное, не ноль. Там должен содержаться сканкод клавиши, количество нажатий и т.д.)
Rentgen (2005-10-20 10:40:00) [9]Это конечно логично, и я проверил:
PostMessage(AdTerminal1.Handle, WM_KEYDOWN, VK_CONTROL , 0);
PostMessage(AdTerminal1.Handle, WM_KEYDOWN, ord('C'),0);
//sleep(500);
PostMessage(AdTerminal1.Handle, WM_KEYUP, ord('C'),0);
PostMessage(AdTerminal1.Handle, WM_KEYUP, VK_CONTROL , 0);
Всеравно приходит обычная 'cc'
Еще идеи есть?
umbra (2005-10-20 10:11:00) [10]по смыслу надо сначала нажать контрол, нажать "с", отпустить "С", отпустить контрол. Т.е. Должно быть несколько сообщений
Rentgen (2005-10-20 09:20:00) [11]Наверно нужно добавить, что это терминальное окно компонента AdTerminal