![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
Несколько последних тем по WinAPI сконцентрированы на одном - как симулировать нажатие клавиш-кнопок (будто нет других вопросов). Здесь я напишу кое-чего. А знающие люди пусть поправят/добавят своё.
Вопрос "возможно ли симулировать действия пользователя (интерфейс) в Windows", сводится к вопросу - "есть ли в библиотеках .dll функции, симулирующие эти действия". И, как известно, они есть. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
Клавиши
Что происходит, когда мы нажимаем кнопку на клавиатуре? Ну сначала работает аппаратная часть, это опускаем, срабатывает прерывание... А вот тут интересно - функция симуляции НАПРЯМУЮ обращается к драйверу клавиатуры и происходит прерывание. вот что говорит SDK: Функция (проце-дура) keybd_event синтезирует нажатие клавиши. Даже больше - она показывает зажата ли клавиша, или поднята. VOID keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD dwExtraInfo ); bVk - апаратно независимый номер клавиши от 1 до 254. bScan - апаратно зависимый номер. Чтобы получить его для bVk используем функцию MapVirtualKey(bvk, 0) dwFlags - либо 0, либо KEYEVENTF_KEYUP, либо KEYEVENTF_EXTENDEDKEY. dwExtraInfo - 32-битное значение ассоциированное с нажатой кнопкой (???) Как узнать номера клавиш? Часто нужно взять название и подставить VK_. Например VK_SHIFT, потом (в Delphi) нажимаете CTRL, жмете на эту константу и попадаете на список всех клавиш... И вот я пишу: Код:
Теперь, чтобы узнать, нажата ли клавиша используем GetKeyState(key). Между прочим нажимать таким образом можно кнопки и на мыши: VK_LBUTTON = 1; //Левая кнопка мыши VK_RBUTTON = 2; Правая кнопка мыши VK_MBUTTON = 4; //Центральная кнопка мыши Последний раз редактировалось BaronTreep; 31.05.2009 в 09:20. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
Немного кайфа.
Кайф такой - все это работает ДАЖЕ КОГДА ПРИЛОЖЕНИЕ НЕ АКТИВНО!!! Можно покричать ещё так - НЕ НАДО СТАВИТЬ ЛОВУШЕК НА КЛАВИШИ И МЫШИ!!! NO SYSTEMHOOK!!! Например - хочу прогу, которую не видит мама с папой, и которая по нажатию ЦентральнаяКнопкаМыши+1 вставляет в активное текстовое поле МОЙ пароль. Так что, "fuck keylogers". Ну просто. Открываем Notepad, пишем Код:
Плюс там непрерывный цыкл, поэтому процесс страшно хавает процессор :-) Но это все легко оптимизировать. Главное метод рабочий! Хуки Есть ещё одно предположение к обсуждению: В Windows некоторые вещи реализованы как (подобно) ловушки. В частности абстракции над прерываниями клавиатуры и мыши. Поэтому ставить хуки на мышь/клаву НЕ надо, приложение может взять всю информацию будочи не активным Ну понятно, что к этому (может бредовому) предположению меня привел пример, который я выше показал. Последний раз редактировалось BaronTreep; 31.05.2009 в 10:04. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
О Мышах
Понятно, что все то же самое можно проделать и с мышкой. Как же надругаться над этим бедным животным? Для этого используем mouse_event из того же user32.dll: Функция (проце-дура) mouse_event синтезирует нажатие кнопок и перемещение мыши. VOID mouse_event( DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, DWORD dwExtraInfo ); флаги принимают значения: MOUSEEVENTF_ABSOLUTE, MOUSEEVENTF_MOVE, MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP, MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP, MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_WHEEL Можно догадаться как их применять. Также не вызывает проблем dx и dy. Ну а последние два параметра - специальные. Для примера создайте таймер, определите глобальные переменные i, dx, dy : integer; И напишите в функции таймера Код:
А вот код для плавного перемещения Код:
Последний раз редактировалось BaronTreep; 31.05.2009 в 09:25. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
Оптимизация цикла
Система при выполнении цикла "захлёбывается", но стоит ввести небольшое ожидание в теле цикла и ресурсы снова распределяются как следует: Код:
Код:
Дополнения по функциям user32.dll Функция ShowCursor(bShow: BOOL) делает курсор видимым/невидимым. Вот этот код заставит курсор мыши мигать: Код:
GetCursorPos(var lpPoint: TPoint) - такой же простой метод снять позицию курсора, пример кода записывающего перемещение мыши в массив, и кода который сможет эти перемещения затем воспроизвести: Код:
функция GetClipCursor(var lpRect: TRect) сравнивает область мыши с областью-аргументом и при совпадении возвращает true. Ещё одна специя - SwapMouseButton(fSwap: BOOL): BOOL; меняет кнопки мыши для левши и обратно. GetKeyState(nVirtKey: Integer) : SHORT; Уже была использована в примере. Для виртуальной клавиши она возвращает состояние - если старший бит 1, то клавиша нажата. На практике это означает равенство либо -127, либо -128, что можно проверить так: (-GetKeyState(vk) in [127, 128]); function VkKeyScan(ch: Char): SHORT; переводит символ из Char в VK, при этом в нижнем байте записан VK код, а в верхнем флаги, идентифицирующие нажатия кнопок shift, ctrl, alt в разных комбинациях. Последний раз редактировалось BaronTreep; 02.06.2009 в 09:29. |
![]() |
![]() |
![]() |
#6 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Пара комментарий:
1.Клавиши А что будет с твоим примером если окно куда нужно все это вписать будет не в фокусе? Он будет писать в то окно которое имеет фокус т.е. куда угодно. Я бы лчше использовал для передачи текстовой информации окну другие способы, Клипбоард или WM_SETTEXT например, ибо в этом случае я ЧЕТКО могу указать получателя (его хендл) 2. Цитата:
К тому же если речь идет о клавиатуре хук поставить не так уж и сложно, и даже без DLL. 3. Цитата:
I'm learning to live...
|
||
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
1.
Цитата:
я же говорю не о способах передачи текста, а о способах симуляции пользователя, и я подозреваю что mouse/keyboard_event - самые примитивные=низкоуровневые функции которые можно взять из kernell для этой цели. 2. Ну во первых хуки грузят систему, это тот же цикл, который windows постоянно прокручивает; потом они, эти жуки, часто используются вредоносным ПО, и приходится добавлять добропорядочную программу в исключения сканеров^анти, это ЕЩЁ грузит систему. GetKeyState - работает когда окно не активно/когда окна нет/оно будет работать даже в сервисе. То же относится к GetCursorPos(Pnt), SetCursorPos. Код HTML:
The keybd_event function synthesizes a keystroke. ... . The keyboard driver's interrupt handler calls the keybd_event function. Можно написать программку: она смотрит нажатые кнопки и сравнивает на предмет вхождения в два словаря - руский и английский, и если вхождение в один словарь, а раскладка другая, переключает раскладку и меняет символы на верные. Прим. : эта симуляция клавиатуры 1000 символов забивает мнугвенно. |
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 29.05.2009
Сообщений: 320
|
![]()
Написал программКу... Есть у неё пара проблема, но уже кое-что можно, например ВОТ эта подсветка текста на Паскале сделана не мной, программой...
Код:
2. По нажатию правый CTRL+F8 берет буфер обмена (если там есть текст, и только текст) заменяет одни символы на другие на основе словаря words.ini. 3. Выгружается по правый CTRL+F12, нужно щелкнуть сообщение о закрытии. Ну вот как он выдал... Проблемы: 1. Русские символы забиваются вопросами... 2. Иногда (если быстро от неё требовать ответа) брыкается ... Если кому интересно, Вот : Последний раз редактировалось BaronTreep; 06.06.2009 в 05:51. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по хукам внутри прораммы | Leloush | Win Api | 2 | 31.01.2009 19:05 |