0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31
|
|
1 | |
Имитация нажатий клавиш клавиатуры15.02.2010, 03:24. Показов 123855. Ответов 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 | 2 |
нужная литература это сам Делфийский хелп... по словам VK_Key
или копай в сторону виртуальной клавиатуры... но мне кажется что твоя задача не выполнима(хотя может просто чего то не знаю..))) ), чтобы повесить на одну клавишу 7 нажатий... хотя... кто его знает..))) З.Ы кстати, в самом хелпе ты найдёшь все кода клавиш...
1
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||||||||||||||||||||||
15.02.2010, 09:54 | 3 | |||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
Для имитации событий от клавиатуры можно посылать сообщения 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 | 4 |
Мммм... интересно... а как сделать как говорил Kapernik, чтобы между нажатиями был таймаут, заданный в секундах??
Добавлено через 26 минут И вопрос в какой это происходит процедуре и куда она "засовывается" ? И как можно записать значение нажатой клавиши, ну чтобы программа считывала что ты нажал.
1
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
16.02.2010, 08:33 | 5 | |||||
Сообщение было отмечено как решение
Решение
Для этого, между вызовами keybd_event() или mouse_event(), можно вызывать процедуру Sleep(). - Она приостанавливает выполнение программы на заданное количество миллисекунд. Значение задержки в миллисекундах передаётся процедуре Sleep() в качестве параметра.
Но! В нашем случае, перед вызовом процедуры Sleep() надо обязательно вызвать метод: Application.ProcessMessages; - это позволит главному окну приложения обработать сообщения, посланные ему процедурой keybd_event(). Если этого не сделать - тогда все сообщения будут обработаны только после окончания нашей процедуры. Это означает, что все задержки по всем вызовам Sleep() внутри нашей процедуры просуммируются и в течение этого времени никаких изменений в реакции приложения (в том числе на экране, если задумано что-то выводить) не будет. Код вызова keybd_event() можно размещать в любых частях кода. Например, в обработчике нажатия кнопки:
TForm.KeyPreview = True - в этом случае, события (OnKeyDown, OnKeyUp, OnKeyPress) сначала возникнут на уровне формы и лишь затем будут переданы на уровень компонентов, расположенных на форме.
5
|
0 / 0 / 1
Регистрация: 17.11.2009
Сообщений: 31
|
|
17.02.2010, 03:20 [ТС] | 6 |
Спасибо огромное. Может кто-нибудь подскажет как кнопке (Button1) назначить горячую клавишу и чтобы я сидел в другом открытом приложении и по вызову горячей кнопки выполнялись необходимые операции без скрытия выполняемой программы. Чтобы она работала фоново... Во! ))
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
|
21.08.2010, 16:03 | 8 |
В программе с помощью keybd_event копирую некий текст, имитируя нажатие Сtrl+A и Ctrl+C, далее с помощью Clipboard.astext записываю в файл содержимое буфера обмена.
Проблема в том, что прога, видимо, сначала пытается записать в файл, а только потом обрабатывает keybd_event. В итоге в файл записывается содержимое буфера, которое было в нем до запуска программы, а текст выделяется и копируется уже после этого. Пробывал вставить Application.ProcessMessages - не помогает.
0
|
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
|
|
21.08.2010, 16:05 | 9 |
amakl, без листингов ничего сказать нельзя
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
||||||
21.08.2010, 16:31 | 10 | |||||
Код:
0
|
{c0Der}
|
|
21.08.2010, 19:18 | 11 |
amakl, все зависит от объема копируемого текста и быстродействия твоего компа, проверено на практике...
Решения могу предложить 3: 1) вставка задержки (подбирается пробным путем); 2) замена "Ctrl+C" на "Ctrl+X" и перед выводом текста в файл переодичная проверка текста окна; 3) замена всех кейбордных операций на ф-ии работы с окнами (поиск окна), считывание текста и т.д.
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
22.08.2010, 14:28 | 12 | |||||
Amakl, если перевод фокуса ввода на поле редактирования выполнен верно, то в таком виде заработает:
--- И ещё надо иметь в виду, что, например, TMemo не умеет выделять весь текст по Ctrl+A. По Ctrl+A текст умеет выделять TRichEdit.
0
|
{c0Der}
|
||||||
22.08.2010, 18:46 | 13 | |||||
Mawrat, попробуй свой код на блокноте, в котором открыт файл на 2-3 МБ...
только если заставить ее выполниться в контексте проги из которой копируем и дождаться от нее ответа
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
22.08.2010, 20:53 | 14 |
Я, как раз, и имел в виду случай, когда надо скопировать из той же прогри, которая вызывает эти функции:
Если требуется копировать из другой проги - предварительно активировав её окно - тогда да - здесь придётся или делать задержку с эмпирически подобранным интервалом времени или надо как-то отслеживать состояние буфера обмена Windows.
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
|
23.08.2010, 01:30 | 15 |
3-й вариант самый удобный, но он к сожалению не подходит. Текст надо считать из чата покерного клуба, в котором оконные функции не отличают дескриптор дочерних окон от дескриптора основного окна, и найти окошко чата не получается. Находить его планировал, двигаясь по окну, имтируя нажатие tab. Может есть какие-то другие пути, чтобы найти дочернее окно в данной ситуации?
2-й вариант не совсем понял, но поскольку из окошка нельзя вырезать, он, видимо, не годится. 1-й вариант с задержкой попробывал - работает. Вопрос - насколько надежен данный метод? На других компах с меньшим быстродействием может не сработать? Могут ли быть ситуации (например, большая нагрузка на процессор), когда метод не сработает?
0
|
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
|
|
23.08.2010, 10:15 | 16 |
amakl, а покер рум случаем не partypoker.com? А то, если что, могу исходники кинуть
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
|
23.08.2010, 12:21 | 17 |
iama,
рум FullTiltPoker
0
|
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
|
|
23.08.2010, 12:27 | 18 |
amakl, жаль, этот рум я не знаю
0
|
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
|
|
24.08.2010, 02:14 | 20 |
Расшифровывать протоколы с сервера тоже не эффективно - клиентская часть программы очень часто обновляется, и протоколы соответственно меняются.
Придется, видимо, ставить большой sleep.
0
|
24.08.2010, 02:14 | |
24.08.2010, 02:14 | |
Помогаю со студенческими работами здесь
20
Эмуляция нажатий клавиш в браузерную строку. Память процесса, эмуляция нажатий клавиш Имитация нажатия клавиш Имитация нажатия клавиш Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |