Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перехват сообщений от мыши

15K
20 апреля 2009 года
like-nix
46 / / 27.06.2007
Всем привет!!!

Пишу программу под OС WinXP с использованием MSVS 9. На C/C++ с использованием MFC разумеется ;)

Задача получить сообщений от мыши ( WM_MOUSEMOVE, WM_NCMOUSEMOVE, WM_LBUTTONDBLCLK, WM_LBUTTONDOWN, WM_LBUTTONUP) и и передать их нужной проге немного измененными. С первого взгляда показалось мне простой и даже кое что получилось.

Сначало о том что получилось:

Получилось перехватить сообщения от мыши и все вобщем то работает.
Значит написал я библу
вызываю
Цитата:
hook = SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)msghook, - процедурина обработки сообщений
hInst,- хэндл моей библы
0);



Цитата:
static LRESULT CALLBACK msghook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
{
CallNextHookEx(hook, nCode, wParam, lParam);
return 0;
}
LPMSG msg = (LPMSG)lParam;
switch(msg->message)
{
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
PostMessage(hWndServer, UWM_MOUSEMOVE, wParam, lParam);
break;
case WM_LBUTTONDBLCLK:
PostMessage(hWndServer, UWM_LBUTTONDBLCLK, wParam, lParam);
break;
case WM_LBUTTONDOWN:
PostMessage(hWndServer, UWM_LBUTTONDOWN, wParam, lParam);
break;
case WM_LBUTTONUP:
PostMessage(hWndServer, UWM_LBUTTONUP, wParam, lParam);
break;
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}


hWndServer - это хендл моей проги где я обрабатываю сообщения

В программе обрабатывающей сообщения я передаю сообщения

Цитата:
PostMessage(MyhWnd, WM_LBUTTONDOWN, 0, 0);
PostMessage(MyhWnd, WM_LBUTTONUP, 0, 0 );


Где MyhWnd - это хэндл окна приложения которому я передаю сообщения

Но вот в чем проблема: при получении фокуса прога, которой я должен слать свои сообщения, обрабатывает сообщения и в мою библиотеку ничего не приходит. Думаю у программы есть свой обработчик сообщений. Думаю что есть какая - то цепочка обработчиков сообщений, в которую нужно вклинить свою библиотеку перед перехватчиком сообщений проги.

Подскажите чего нибудь.

45K
20 апреля 2009 года
qpokyc
21 / / 27.03.2009
Запости код целиком плиз (а лучше - выложи исходник).

Это может быть из-за того что:
1) MyhWnd инициализируется за пределами библиотеки (скорее всего)
2) Приложение-приемник виснет, когда ты включаешь хук (а почему функция ловушки не отфильтровывает окно-приемник? Ведь с него сообщения тоже снимаются!)
3)
Цитата:
nCode < 0


Здесь ты пытаешся отфильтровать это окно, но это не то! Твоя ловушка отбрасывает сообщения, посылаемые прогой, за которой ты наблюдаешь, т.е. вот она - причина "почему не виснет" :D

Цитата:
hWndServer - это хендл моей проги где я обрабатываю сообщения


Что-то неправдоподобное - в Windows у всех приложений свои адресные пространства и они могут ссылаться только внутри себя (а библиотека с ловушкой загружается в каждый процесс отдельно, потому и надо все переменные инициализировать внутри библиотеки). Если это хэндл окна, то другой вопрос.

535
20 апреля 2009 года
Нездешний
537 / / 17.01.2008
Цитата:
Думаю у программы есть свой обработчик сообщений. Думаю что есть какая - то цепочка обработчиков сообщений, в которую нужно вклинить свою библиотеку перед перехватчиком сообщений проги.

Все примерно так и есть. Устанавливая ловушку, вы "вклиниваетесь" в эту цепочку обработчиков. Подробнее - к Рихтеру.
Уточню:
1. Расположены ли данные, относящиеся к установки ловушки (в частности hInst - хэндл библиотеки), в shared-секции?
2. Зарегистрированы ли сообщения UWM_xxx как глобальные с помощью RegisterWindowMessage()?
3. Кто, собственно, устанавливает ловушку? Какое приложение?
4. Как вы определили, что "все работает"? :)

15K
20 апреля 2009 года
like-nix
46 / / 27.06.2007
Цитата:
Расположены ли данные, относящиеся к установки ловушки (в частности hInst - хэндл библиотеки), в shared-секции?


Код:
__declspec(dllexport) BOOL setMyHook(HWND hWnd)
    {
     if(hWndServer != NULL)
    return FALSE;
     hook = SetWindowsHookEx(WH_GETMESSAGE,
                (HOOKPROC)msghook,
                hInst,
                0);
     if(hook != NULL)
    {
     hWndServer = hWnd;
     return TRUE;
    }
     return FALSE;
    }


__declspec(dllexport) BOOL clearMyHook(HWND hWnd)
    {
     if(hWnd != hWndServer || hWnd == NULL)
    return FALSE;
     BOOL unhooked = UnhookWindowsHookEx(hook);
     if(unhooked)
    hWndServer = NULL;
     return unhooked;
    }


Цитата:
Зарегистрированы ли сообщения UWM_xxx как глобальные с помощью RegisterWindowMessage()?



 
Код:
#define UWM_MOUSEMOVE_MSG _T("UWM_MOUSEMOVE_MSG-44E531B1_14D3_11d5_A025_006067718D04")
#define UWM_LBUTTONDBLCLK_MSG _T("UWM_LBUTTONDBLCLK_MSG-54E531B1_14D3_11d5_A025_006067718D04")
#define UWM_LBUTTONDOWN_MSG _T("UWM_LBUTTONDOWN_MSG-64E531B1_14D3_11d5_A025_006067718D04")
#define UWM_LBUTTONUP_MSG _T("UWM_LBUTTONUP_MSG-74E531B1_14D3_11d5_A025_006067718D04")


 
Код:
UWM_MOUSEMOVE = RegisterWindowMessage(UWM_MOUSEMOVE_MSG);
        UWM_LBUTTONDBLCLK = RegisterWindowMessage(UWM_LBUTTONDBLCLK_MSG);
        UWM_LBUTTONDOWN = RegisterWindowMessage(UWM_LBUTTONDOWN_MSG);
        UWM_LBUTTONUP = RegisterWindowMessage(UWM_LBUTTONUP_MSG);


Цитата:
Кто, собственно, устанавливает ловушку? Какое приложение?


С помощью мастера сделал диалог без использования ATL

 
Код:
class CHookDlg : public CDialog


Хук ставлю функцией в моем диалоговом приложении
 
Код:
BOOL result = setMyHook(m_hWnd);


Вообще о приложении, которым хочу управлять - это прога использует OpenGl и DirectX при получении фокуса захватывает курсор и не дает ему вылезти за пределы окна в общем как 3d гамеса.

Цитата:
Как вы определили, что "все работает"?


На Notepad и др приложениях тестировал.
Сообщения обрабатываются, но не совсем так ка хочется.
Хочется чтобы я получал сообщение от мыши обрабатывал его не давал дальше обрабатывать др приложениям в том числе и проге, которой хочу управлять, вместо него я хочу посылать собственные измененные сообщения только проге, которой хочу управлять.

Цитата:
Подробнее - к Рихтеру.


Да уже читаю

Но ВЫ всеравно подсказывайте ;)

355
20 апреля 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
AFAIK OpenGL никакого интерфейса к клаве\мыши не даёт. у DirectX есть DirectInput - подсистема, которая, насколько я понял, не завязано на WinAPI, а работает ниже её (здесь я могу ошибаться), поэтому совсем не факт, что хуками что-то получиться с этим сделать
535
20 апреля 2009 года
Нездешний
537 / / 17.01.2008
Цитата:
Хочется чтобы я получал сообщение от мыши обрабатывал его не давал дальше обрабатывать др приложениям в том числе и проге, которой хочу управлять, вместо него я хочу посылать собственные измененные сообщения только проге, которой хочу управлять.

Просто не вызывайте CallNextHookEx в обработчике ловушки

15K
20 апреля 2009 года
like-nix
46 / / 27.06.2007
Цитата:

AFAIK OpenGL никакого интерфейса к клаве\мыши не даёт. у DirectX есть DirectInput - подсистема, которая, насколько я понял, не завязано на WinAPI, а работает ниже её (здесь я могу ошибаться), поэтому совсем не факт, что хуками что-то получиться с этим сделать



Тренеры к играм както ведь пишут;)

355
20 апреля 2009 года
&lt;SCORP&gt;
786 / / 21.10.2006
факт! если разберётесь как, обязательно отпишитесь!
мы с друзьями жутко пёрлись одно время с МК4 на компе. но в неё жутко неудобно играть вдвоём на одной клаве, потому что зажимается одновременно куча клавиш и клава просто залипает ) были мысли уже как-то реализовать в ней игру по сети, но тогда ещё не хватило моска, как это сделать :)
15K
21 апреля 2009 года
like-nix
46 / / 27.06.2007
Господа нашел возможное решение моей проблемы Direct3D Hook Starter-Kit v1.0 но не знаю не производителя и не знаю платный или бесплатный продукт. Если кто юзал поделитесь опытом и если бесплатный поделитесь софтиной.
15K
23 апреля 2009 года
like-nix
46 / / 27.06.2007
DirectInput мне помог. Всем спасибо за участие.
98K
01 августа 2016 года
Vucheuk
1 / / 01.08.2016
А я все искал как осущесвить перехват сообщений вибер девушки. постоянно сидела в телефоне и с кем то общалась... перепробовал кучу программ по рекламе в интернете - понял, что все это лажа. Но потом наткнулся на обьявление одного профи который якобы занимается подобными делами а именно перехватом сообщений вибера и вацапа. с помощью этого человека смог узнать... вот номер его +79298297542
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог