Вниз
Скачать: CL | DM;

Oтправить комбинацию Crtl+C   Найти похожие ветки 

 
Rentgen ©   (2005-10-20 09:14) [0]

Всем привет!

Нужно отправить комбинацию клавишь в текстовое окно своей программы - Ctrl+C.

Делаю так:

PostMessage(HWND, WM_KEYDOWN, Ord("C"), MOD_CONTROL);


Посылается обычная "c"
Хотя в результате нужно: ^C

//пробовал WM_KEYFIRST, SendMessage - таже проблема.

Что я делаю не так?

P.S.
Вручную комбинация работает и выдает: ^C


 
Rentgen ©   (2005-10-20 09:20) [1]

Наверно нужно добавить, что это терминальное окно компонента AdTerminal


 
umbra ©   (2005-10-20 10:11) [2]

по смыслу надо сначала нажать контрол, нажать "с", отпустить "С", отпустить контрол. Т.е. Должно быть несколько сообщений


 
Rentgen ©   (2005-10-20 10:40) [3]

Это конечно логично, и я проверил:

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:52) [4]

Но ведь в lParam (четвертый аргумент) должен быть, наверное, не ноль. Там должен содержаться сканкод клавиши, количество нажатий и т.д.)


 
Rentgen ©   (2005-10-20 11:12) [5]

Когда-то написал программу:

AutoCheats (http://autocheats.narod.ru)

Она симулирует нажатие клавиш (для игр делал - набирать коды)
дк вот там я точно неиспользовал 4 параметр так как  [4]

и все же вопрос открыт.


 
Ботвин Дмитрий   (2005-10-20 11:42) [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:46) [7]


> Ботвин Дмитрий   (20.10.05 11:42) [6]


Если вы имеете  в виду ставить паузу, то эт я пробовал.
тоже самое... :((((


 
Rentgen ©   (2005-10-20 12:04) [8]


> ALL

Очень нужно!!!! Горю!!!


 
Ботвин Дмитрий   (2005-10-20 12:27) [9]

Можно попробывать keybd_event, чаще всего помагает


 
Rentgen ©   (2005-10-20 12:43) [10]


> Ботвин Дмитрий   (20.10.05 12:27) [9]


пробовал... (((((


 
Ботвин Дмитрий   (2005-10-20 12:51) [11]

Если 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);

Должно сработать :-)))



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.028 c
14-1132075768
bogdan
2005-11-15 20:29
2005.12.18
запуск из коммандной строки


6-1122536583
Курдль
2005-07-28 11:43
2005.12.18
Client/ServerSockets. Как найти все сокеты, активные в сети?


14-1132644606
Piter
2005-11-22 10:30
2005.12.18
На новых материнках нету LPT?


4-1129396275
g-l-u-k
2005-10-15 21:11
2005.12.18
Очистка контрола


3-1130736135
chsv
2005-10-31 08:22
2005.12.18
Не выполняется удаление из Access через ADO




   Наверх