Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо