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

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

keybd_event - CTRL+C


Страницы:   1 2

Kerk ©   (2005-07-04 09:51:00) 

Пытаюсь имитировать нажатие 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);        


Alexander Panov   (2005-07-07 17:36:00) [1]

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


serko   (2005-07-07 17:07:00) [2]

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


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

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


Virgo_Style   (2005-07-07 10:06:00) [4]

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


serko   (2005-07-07 09:59:00) [5]

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

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-05 12:41:00) [6]

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


serko   (2005-07-05 11:56:00) [7]

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


Virgo_Style   (2005-07-05 08:50:00) [8]

serko ©   (05.07.05 0:17) [13]

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


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

>> 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);


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


alpet   (2005-07-04 18:06:00) [10]

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


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


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


alpet   (2005-07-04 16:24:00) [12]

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


serko   (2005-07-04 15:10:00) [13]

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


serko   (2005-07-04 15:08:00) [14]

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


alpet   (2005-07-04 14:13:00) [15]

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

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


dmitry501   (2005-07-04 12:13:00) [16]

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


dmitry501   (2005-07-04 12:12:00) [17]

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


Kerk   (2005-07-04 11:57:00) [18]

Вдогонку :)

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

bScan
   This parameter is not used.


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


alpet   (2005-07-04 10:46:00) [19]

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


alpet   (2005-07-04 10:45:00) [20]


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;

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


Страницы:   1 2

Наверх

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