Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.056 c
14-1123121764
КаПиБаРа
2005-08-04 06:16
2005.08.28
Чего только не нарисуют


3-1121605921
Jet
2005-07-17 17:12
2005.08.28
Access - объединение двух баз


6-1116257359
ValeX
2005-05-16 19:29
2005.08.28
как обновлять поля на сайте


4-1121014897
pirate
2005-07-10 21:01
2005.08.28
Как считать значение ячейки памяти?


4-1121056430
Untermensch
2005-07-11 08:33
2005.08.28
Как заставить систему выйти диалапом в инет и обратно.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский