![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
keybd_event - CTRL+C
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;
Вроде работает..