Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

keybd_event - CTRL+C   Найти похожие ветки 

 
Kerk ©   (2005-07-04 09:51) [0]

Пытаюсь имитировать нажатие CTRL+C.. как-то странно себя этот код ведет.. по всем ощущениям CTRL не отпускается..

   keybd_event(VK_CONTROL,0,0,0);
   keybd_event(MapVirtualKey(Ord("C"),1),0,0,0);
   keybd_event(MapVirtualKey(Ord("C"),1),0,KEYEVENTF_KEYUP,0);
   keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);        


 
alpet ©   (2005-07-04 10:10) [1]

Есть различные флажки, в том числе и KEYEVENTF_EXTENDEDKEY, попробуй его для VK_CONTROL - может подойдет.


 
alpet ©   (2005-07-04 10:45) [2]


procedure PressCtrlC;
var scan: byte;
begin
scan := MapVirtualKey (VK_CONTROL, 0);
keybd_event(VK_CONTROL, scan, 0,0);
sleep (100);
keybd_event(ord ("C"), 0, 0, 0);
sleep (100);
keybd_event(ord ("C"), 0, KEYEVENTF_KEYUP,0);
sleep (100);
keybd_event(VK_CONTROL, scan, KEYEVENTF_KEYUP,0);
end;

Вроде работает..


 
alpet ©   (2005-07-04 10:46) [3]

Все Sleep можно убрать.


 
Kerk ©   (2005-07-04 11:57) [4]

Вдогонку :)

VOID keybd_event(
   BYTE bVk,
   BYTE bScan,
   DWORD dwFlags,
   PTR dwExtraInfo
);

bScan
   This parameter is not used.


Тем не менее регулярно вижу использование этого параметра. Зачем??


 
dmitry501 ©   (2005-07-04 12:12) [5]

Kerk ©   (04.07.05 11:57) [4]
Наверно для уневирсальности. Для Windows CE
bScan
[in] Specifies a hardware scan code for the key.


 
dmitry501 ©   (2005-07-04 12:13) [6]

dmitry501 ©   (04.07.05 12:12) [5]
"уневирсальности" читать как "универсальности" :)


 
alpet ©   (2005-07-04 14:13) [7]

Я заметил это, и без scan все прекрасно работает. Но пример в MSDN к этой функции почему-то имеет такой вид:

 // Simulate a key press
   keybd_event( VK_NUMLOCK,
                     0x45, // Scan code - not used :)
                     KEYEVENTF_EXTENDEDKEY | 0,
                     0 );


 
serko ©   (2005-07-04 15:08) [8]

А как тогда нажать Ctrl+Alt+1!


 
serko ©   (2005-07-04 15:10) [9]

Удалено модератором
Примечание: Дубль


 
alpet ©   (2005-07-04 16:24) [10]

Если просто - с помощью клавиатуры. Программно выше описанным способом - сначала симулировать нажатие control, alt, 1, затем отпускание но в обратном порядке.


 
ANB ©   (2005-07-04 17:30) [11]


> alpet ©   (04.07.05 16:24) [10]
- а через сообщения ? Без keyb_event ?


 
alpet ©   (2005-07-04 18:06) [12]

ANB ©   (04.07.05 17:30) [11]
Еще можно через хуки, можно драйвер написать, в случае консольных/DOS приложений - перехватить стандартный ввод. Способов много - выбирай какой нравится.
Касательной сообщений - WM_SYSKEYDOWN + WM_SYSKEYUP и WM_KEYDOWN + WM_KEYUP обеспечивают для гуевых (GUI) приложений несложную симуляцию нажатия клавиши.


 
serko ©   (2005-07-05 00:17) [13]

>> alpet ©   (04.07.05 16:24) [10]
Так чтоли?

scan := MapVirtualKey (VK_CONTROL, 0);
keybd_event(VK_CONTROL, scan, 0,0);
sleep (100);
keybd_event(VK_ALT, scan, 0,0);
sleep (100);
keybd_event(ord ("1"), 0, 0, 0);
sleep (100);
keybd_event(ord ("1"), 0, KEYEVENTF_KEYUP,0);
sleep (100);
keybd_event(VK_ALT, scan, KEYEVENTF_KEYUP,0);
sleep (100);
keybd_event(VK_CONTROL, scan, KEYEVENTF_KEYUP,0);


Если че подправьте!


 
Virgo_Style ©   (2005-07-05 08:50) [14]

serko ©   (05.07.05 0:17) [13]

VK_CONTROL и VK_ALT соответствуют разные scan - коды %-)


 
serko ©   (2005-07-05 11:56) [15]

А у меня пишет что VK_Alt не известный идентификатор!


 
Virgo_Style ©   (2005-07-05 12:41) [16]

Действительно. Надо VK_MENU %-)


 
serko ©   (2005-07-07 09:59) [17]

Ну вот я так сделал:

procedure TForm1.Button1Click(Sender: TObject);
var scan: byte;
   scan1:byte;
begin
    scan := MapVirtualKey (VK_CONTROL, 0);
    Scan1:= MapVirtualKey (VK_Menu, 0);
    keybd_event(VK_CONTROL, scan, 0,0);
    sleep (100);
    keybd_event(VK_Menu, scan1, 0,0);
    sleep (100);
    keybd_event(ord ("w"), 0, 0, 0);
    sleep (100);
    keybd_event(ord ("w"), 0, KEYEVENTF_KEYUP,0);
    sleep (100);
    keybd_event(VK_Menu, scan1, KEYEVENTF_KEYUP,0);
    sleep (100);
    keybd_event(VK_CONTROL, scan, KEYEVENTF_KEYUP,0);
end;
<\code>

Но по нажатию на Button должно проиходить Windowsовское событие, а не происходит! Если ручками нажать то работает а через Button не хочет! Это получается горячие клавиши на которые я могу настроить что угодно!

Че делать?


 
Virgo_Style ©   (2005-07-07 10:06) [18]

А слабО было взять и заменить "w" на "W"? Или для этого обязательно подсказка нужна? :-\


 
serko ©   (2005-07-07 17:05) [19]

Гыыыыы работает! А как быть тогда для Ctrl+Alt+1?


 
serko ©   (2005-07-07 17:07) [20]

Всем спасибо ВСЕ работает!


 
Alexander Panov ©   (2005-07-07 17:36) [21]

Вместо Ord можно использовать VkKeyScanEx и VkKeyScan.



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

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
3-1121438865
_Anton
2005-07-15 18:47
2005.08.28
ODBC и BLOB


14-1123053696
Jeer
2005-08-03 11:21
2005.08.28
ABC лишилась аккредитации в России


5-1095141902
Lera
2004-09-14 10:05
2005.08.28
Инсталяция компоненты.


14-1123314339
Alex Konshin
2005-08-06 11:45
2005.08.28
Электронные географические карты мира


14-1122976090
Kerk
2005-08-02 13:48
2005.08.28
В оутлук можно задать правила...