Главная страница
    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.49 MB
Время: 0.045 c
3-1121678289
Viktor1
2005-07-18 13:18
2005.08.28
Exception сервера об отсутствии прав у пользователя.


14-1122963567
MeF Dei Corvi
2005-08-02 10:19
2005.08.28
Шрифты в WinXP


1-1122897851
Ilg
2005-08-01 16:04
2005.08.28
Проблемы с использованием XPManifest


1-1123164593
Русланка
2005-08-04 18:09
2005.08.28
А как в DBComboBox программно установить какую либо строку


3-1121689295
RusLAN_
2005-07-18 16:21
2005.08.28
DBF в ДОС кодировке. Параметры подключения.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский