0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31
|
|
Имитация нажатий клавиш клавиатуры15.02.2010, 03:24. Показов 127488. Ответов 38
Метки changeclipboardchain, keybd_event, setclipboardviewer, wmchangecbchain, wmdrawclipboard, wm_changecbchain, wm_drawclipboard, буфер обмена windows, наблюдение за буфером, перехват нажатий клавиш (Все метки)
Как соорудить программу, чтобы по нажатию ранее назначеной клавише происходила имитация нажатия некоторой комбинации клавиш. Пример: я нажимаю правый Ctrl программа сама имитирует 5 поочерёдных нажатий клавиши f7, причём с таймаутом 5 секунд. Во многом придёца разбираца, мот кто подкинет нужную литературку?
0
|
15.02.2010, 03:24 | |
Ответы с готовыми решениями:
38
Эмуляция нажатий клавиш
|
Junior Developer
![]() 44 / 44 / 7
Регистрация: 08.06.2009
Сообщений: 261
|
|
15.02.2010, 08:33 | |
нужная литература это сам Делфийский хелп... по словам VK_Key
или копай в сторону виртуальной клавиатуры... но мне кажется что твоя задача не выполнима(хотя может просто чего то не знаю..))) ), чтобы повесить на одну клавишу 7 нажатий... хотя... кто его знает..))) З.Ы кстати, в самом хелпе ты найдёшь все кода клавиш...
1
|
![]() 13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||||||||||||||||
15.02.2010, 09:54 | ||||||||||||||||||||||||||
![]() Решение
Для имитации событий от клавиатуры можно посылать сообщения WM_KEYDOWN и WM_KEYUP. Либо есть более удобный способ - применение процедуры keybd_event():
bVk - виртуальный код клавиши. bScan - аппаратный скан-код. Устанавливаем = 0. dwFlags - флаг, задающий нажатие или отпускание клавиши. Если требуется, имитация нажатия: dwFlags = 0, имитация отпускания: dwFlags = KEYEVENTF_KEYUP. Ещё этот параметр может быть установлен = KEYEVENTF_EXTENDEDKEY. - Это значение использовать не будем. Оно связано со скан-кодом. dwExtraInfo - дополнительные данные, связанные с событием от клавиатуры. Установить = 0. --- Например, имитация 5 нажатий клавиши F7:
Например, имитация Ctrl+Shift+z:
Например, имитация ввода в Мемо слова 'Start':
Коды виртуальных клавиш
Virtual Key Code Corresponding key VK_LBUTTON Left mouse button VK_RBUTTON Right mouse button VK_CANCEL Control+Break VK_MBUTTON Middle mouse button VK_BACK Backspace key VK_TAB Tab key VK_CLEAR Clear key VK_RETURN Enter key VK_SHIFT Shift key VK_CONTROL Ctrl key VK_MENU Alt key VK_PAUSE Pause key VK_CAPITAL Caps Lock key VK_KANA Used with IME VK_HANGUL Used with IME VK_JUNJA Used with IME VK_FINAL Used with IME VK_HANJA Used with IME VK_KANJI Used with IME VK_CONVERT Used with IME VK_NONCONVERT Used with IME VK_ACCEPT Used with IME VK_MODECHANGE Used with IME VK_ESCAPE Esc key VK_SPACE Space bar VK_PRIOR Page Up key VK_NEXT Page Down key VK_END End key VK_HOME Home key VK_LEFT Left Arrow key VK_UP Up Arrow key VK_RIGHT Right Arrow key VK_DOWN Down Arrow key VK_SELECT Select key VK_PRINT Print key (keyboard-specific) VK_EXECUTE Execute key VK_SNAPSHOT Print Screen key VK_INSERT Insert key VK_DELETE Delete key VK_HELP Help key VK_LWIN Left Windows key (Microsoft keyboard) VK_RWIN Right Windows key (Microsoft keyboard) VK_APPS Applications key (Microsoft keyboard) VK_NUMPAD0 0 key (numeric keypad) VK_NUMPAD1 1 key (numeric keypad) VK_NUMPAD2 2 key (numeric keypad) VK_NUMPAD3 3 key (numeric keypad) VK_NUMPAD4 4 key (numeric keypad) VK_NUMPAD5 5 key (numeric keypad) VK_NUMPAD6 6 key (numeric keypad) VK_NUMPAD7 7 key (numeric keypad) VK_NUMPAD8 8 key (numeric keypad) VK_NUMPAD9 9 key (numeric keypad) VK_MULTIPLY Multiply key (numeric keypad) VK_ADD Add key (numeric keypad) VK_SEPARATOR Separator key (numeric keypad) VK_SUBTRACT Subtract key (numeric keypad) VK_DECIMAL Decimal key (numeric keypad) VK_DIVIDE Divide key (numeric keypad) VK_F1 F1 key VK_F2 F2 key VK_F3 F3 key VK_F4 F4 key VK_F5 F5 key VK_F6 F6 key VK_F7 F7 key VK_F8 F8 key VK_F9 F9 key VK_F10 F10 key VK_F11 F11 key VK_F12 F12 key VK_F13 F13 key VK_F14 F14 key VK_F15 F15 key VK_F16 F16 key VK_F17 F17 key VK_F18 F18 key VK_F19 F19 key VK_F20 F20 key VK_F21 F21 key VK_F22 F22 key VK_F23 F23 key VK_F24 F24 key VK_NUMLOCK Num Lock key VK_SCROLL Scroll Lock key VK_LSHIFT Left Shift key (only used with GetAsyncKeyState and GetKeyState) VK_RSHIFT Right Shift key (only used with GetAsyncKeyState and GetKeyState) VK_LCONTROL Left Ctrl key (only used with GetAsyncKeyState and GetKeyState) VK_RCONTROL Right Ctrl key (only used with GetAsyncKeyState and GetKeyState) VK_LMENU Left Alt key (only used with GetAsyncKeyState and GetKeyState) VK_RMENU Right Alt key (only used with GetAsyncKeyState and GetKeyState) VK_PROCESSKEY Process key VK_ATTN Attn key VK_CRSEL CrSel key VK_EXSEL ExSel key VK_EREOF Erase EOF key VK_PLAY Play key VK_ZOOM Zoom key VK_NONAME Reserved for future use VK_PA1 PA1 key VK_OEM_CLEAR Clear key --- Аналогично можно имитировать нажатия кнопок мыши. Для этого есть процедура mouse_event(dwFlags, dx, dy, dwData, dwExtraInfo: DWORD). Значения флага dwFlags:
12
|
1 / 1 / 1
Регистрация: 20.11.2009
Сообщений: 76
|
|
16.02.2010, 01:49 | |
Мммм... интересно... а как сделать как говорил Kapernik, чтобы между нажатиями был таймаут, заданный в секундах??
Добавлено через 26 минут И вопрос в какой это происходит процедуре и куда она "засовывается" ? И как можно записать значение нажатой клавиши, ну чтобы программа считывала что ты нажал.
1
|
![]() 13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||
16.02.2010, 08:33 | |||||||||
![]() РешениеНо! В нашем случае, перед вызовом процедуры Sleep() надо обязательно вызвать метод: Application.ProcessMessages; - это позволит главному окну приложения обработать сообщения, посланные ему процедурой keybd_event(). Если этого не сделать - тогда все сообщения будут обработаны только после окончания нашей процедуры. Это означает, что все задержки по всем вызовам Sleep() внутри нашей процедуры просуммируются и в течение этого времени никаких изменений в реакции приложения (в том числе на экране, если задумано что-то выводить) не будет.
TForm.KeyPreview = True - в этом случае, события (OnKeyDown, OnKeyUp, OnKeyPress) сначала возникнут на уровне формы и лишь затем будут переданы на уровень компонентов, расположенных на форме.
5
|
0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31
|
|
17.02.2010, 03:20 [ТС] | |
Спасибо огромное. Может кто-нибудь подскажет как кнопке (Button1) назначить горячую клавишу и чтобы я сидел в другом открытом приложении и по вызову горячей кнопки выполнялись необходимые операции без скрытия выполняемой программы. Чтобы она работала фоново... Во! ))
0
|
![]() 13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
|
|
17.02.2010, 17:42 | |
Вот пример глобального хот кея.
1
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
|
21.08.2010, 16:03 | |
В программе с помощью keybd_event копирую некий текст, имитируя нажатие Сtrl+A и Ctrl+C, далее с помощью Clipboard.astext записываю в файл содержимое буфера обмена.
Проблема в том, что прога, видимо, сначала пытается записать в файл, а только потом обрабатывает keybd_event. В итоге в файл записывается содержимое буфера, которое было в нем до запуска программы, а текст выделяется и копируется уже после этого. Пробывал вставить Application.ProcessMessages - не помогает.
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
||||||
21.08.2010, 16:31 | ||||||
Код:
0
|
{c0Der}
![]() |
|
21.08.2010, 19:18 | |
amakl, все зависит от объема копируемого текста и быстродействия твоего компа, проверено на практике...
Решения могу предложить 3: 1) вставка задержки (подбирается пробным путем); 2) замена "Ctrl+C" на "Ctrl+X" и перед выводом текста в файл переодичная проверка текста окна; 3) замена всех кейбордных операций на ф-ии работы с окнами (поиск окна), считывание текста и т.д.
0
|
![]() 13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||
22.08.2010, 14:28 | ||||||
Amakl, если перевод фокуса ввода на поле редактирования выполнен верно, то в таком виде заработает:
--- И ещё надо иметь в виду, что, например, TMemo не умеет выделять весь текст по Ctrl+A. По Ctrl+A текст умеет выделять TRichEdit.
0
|
{c0Der}
![]() |
||||||
22.08.2010, 18:46 | ||||||
Mawrat, попробуй свой код на блокноте, в котором открыт файл на 2-3 МБ...
только если заставить ее выполниться в контексте проги из которой копируем и дождаться от нее ответа ![]()
0
|
![]() 13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||
22.08.2010, 20:53 | |||
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
||
23.08.2010, 01:30 | ||
2-й вариант не совсем понял, но поскольку из окошка нельзя вырезать, он, видимо, не годится. 1-й вариант с задержкой попробывал - работает. Вопрос - насколько надежен данный метод? На других компах с меньшим быстродействием может не сработать? Могут ли быть ситуации (например, большая нагрузка на процессор), когда метод не сработает?
0
|
{c0Der}
![]() |
|||
23.08.2010, 13:28 | |||
1
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
||
24.08.2010, 02:14 | ||
Придется, видимо, ставить большой sleep.
0
|
24.08.2010, 02:14 | |
Помогаю со студенческими работами здесь
20
Подсчет нажатий клавиш на клавиатуре
Память процесса, эмуляция нажатий клавиш Имитация нажатия клавиш Имитация нажатия клавиш Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
|
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
|
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
|
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг.
Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя.
Странные серые краски проникают и. . .
|
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
|
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
|
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
|
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
|
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
|
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
|