Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как записать кнопконажатия  (Прочитано 11695 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 03-05-2006 15:14 » 

есть такая необходимость - "подсмотреть" и записать все сообщения от клавы на компе (глобально)

как такое делается?
(Мне надо разобраться до того места, как перехватить все эти сообщения)
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 03-05-2006 16:11 » 

Глобальный хук на клавиатуру вешай.

1. Создаеш свою Dll. В ней определяеш функцию
Код:
LRESULT CALLBACK KeyboardProc(

    int code, // hook code
    WPARAM wParam, // virtual-key code
    LPARAM lParam // keystroke-message information
   );
Она будет в чужих процессах получать управление при нажатии на кнопку.
2. В своем приложении читаеш при помоши LoadLibrary библиотеку. И при помоши функции SetWindowsHookEx вешаеш хук с параметром WH_KEYBOARD.
Ну и соответственно нужно при выходе из программы все открытые хэндлы закрыть.

Вот пример самой функции. Правда она сделана на действия мыши, но принцип один и тот же.
Код:
LRESULT CALLBACK MouseProc(

    int nCode, // hook code
    WPARAM wParam, // message identifier
    LPARAM lParam // mouse coordinates
   )
{

    MOUSEHOOKSTRUCT * mc= (MOUSEHOOKSTRUCT *) lParam;
static HWND hwnd=0;
if (hwnd != 0)
{
if (hwnd != mc->hwnd)               
{
PostMessage(hwnd,WM_RECTLEAVE,0,0);
hwnd=mc->hwnd;
}
}
else hwnd=mc->hwnd;

return CallNextHookEx(NULL,nCode,wParam,lParam);
}

Вот код, который регистрирует хук в твоей программе:
Код:
AppDll=LoadLibrary("AppDll.dll");
if (AppDll !=NULL)
{
typedef LRESULT (CALLBACK *TMouseProc)(int, WPARAM, LPARAM);
hook = SetWindowsHookEx(WH_MOUSE, (TMouseProc) GetProcAddress(AppDll,"MouseProc"),AppDll,0);
}
Ну и код убийства всех хэндлов
Код:
if (hook !=NULL) UnhookWindowsHookEx(hook);
hook=NULL;
if (AppDll !=NULL) FreeLibrary(AppDll);
AppDll=NULL;
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 03-05-2006 18:00 » 

пасиб, щас опробуем...

опробовал, не удаётся получить хендл хука:

в ддл у меня:
Код:
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBoxA(/*HWND hWnd*/0,"нажали",0,MB_APPLMODAL);
return CallNextHookEx(NULL,nCode,wParam,lParam);
}

ставлю хук (пытаюсь то есть):
Код:
void CMyhookappDlg::SetHook()
{
//тут лежит моя длл
m_hAppDll=LoadLibrary("C:\\mydll.dll");

if(m_hAppDll)
{
//тут [b]m_hAppDll == 0x10000000[/b]
m_hook=SetWindowsHookEx(
WH_KEYBOARD,
(HOOKPROC)GetProcAddress(m_hAppDll,"KeyboardProc"),
m_hAppDll,
0
);

//тут [b]m_hook==0[/b]
}
}

что я не так делаю?.

собственно,
GetProcAddress(m_hAppDll,"KeyboardProc");
тоже вертает 0
« Последнее редактирование: 03-05-2006 18:28 от Алексей1153 » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 03-05-2006 18:05 » 

Алексей1153,  Ответь на два вопроса
1. Ты определил в Dll, что функция  KeyboardProc экспортируемая?
2. Ты определил псевдонимы данной функции через def файл?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 03-05-2006 18:07 » 

Вообще и установку и процедуру я делал в одной библиотеке... Мне кажется так лучше, или даже по другому не работает, точно не помню. Просто сделай в библиотеке обертку для SetWindowsHookEx и вызывай ее из приложения. Еще функция хука должна быть статической.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 03-05-2006 18:16 » 

Scorp__), Насчет статичной Здесь была моя ладья... Это не ООП. Ту схему, что я привел. У меня работает. Хотя можно и делать хук в функции DllMain самой Dll. Тогда надо ставить будет зашиту, чтобы хук не ставился многократно. Так как, когда процесс загружает библиотеку, то автоматически будет вызвана функция DllMain с параметром DLL_PROCESS_ATTACH.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 03-05-2006 18:28 » 

Finch,
1) неа... теперь добавил __declspec(dllexport) перед процедурой в длл - вроде так?
__declspec(dllexport) LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{

2) это как?

Scorp__), ммм... что есть обёртка? (чайник мы в длл Улыбаюсь )
Записан

Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-05-2006 18:57 » 

Finch, у меня если не определять функцию как static, глобальный хук не работал... вроде бы Улыбаюсь

 Алексей1153, обертка - это название функции или класса, которые предоставляют ту же функциональность, что и API, но позволяют скрыть использование API для программиста, который пользуется твоим модулем, и собрать всю работу с API в одной библиотеке. То есть пишешь в библиотеке функцию StartSniff, в которой просто вызываешь SetWindowsHookEx(). Адрес процедуры хука тебе уже получать не надо: она в той же библиотеке, ну и вообще... удобнее. А из приложения, которое подключает твою библиотеку вызываешь уже StartSniff() когда ставишь хук, и StopSniff(), когда заканчиваешь с ним работу.

Все равно путано получилось, но, надеюсь, идею ты понял Улыбаюсь   

 
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 03-05-2006 19:20 » 

Scorp__), Можеш привети пример, как нужно ставить static. У меня компилятор сразу обругался.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 03-05-2006 19:33 » 

Finch, ок, разобрался вроде, пасиба Улыбаюсь

Scorp__), идею понял Улыбаюсь попробую и так. Тоже пасибки

статик не понадобился
Записан

Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 04-05-2006 07:43 » 

Finch, только когда приеду домой посмотрю, добавлю потом к этому посту.

Вот доехал Улыбаюсь
Оказалось, что очень просто все записано

Код:
static LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam);

Но это в .cpp файле, в котором определение этой функции, компилятор не ругался.
« Последнее редактирование: 04-05-2006 14:29 от Scorp__) » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines