Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват сообщений от мыши, Перехват сообщений от мыши 
:(
    Опции темы
likenix
Дата 20.4.2009, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Всем привет!!!

Пишу программу под 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 - это хэндл окна приложения которому я передаю сообщения

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

Подскажите чего нибудь.
PM MAIL   Вверх
Albor
Дата 20.4.2009, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Попробуй PostMessage заменить на SendMessage, вдруг поможет.
PM MAIL ICQ   Вверх
likenix
Дата 20.4.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Albor, ыыыыы
Хех не так все просто товарищ
Кое что сейчас обдумываю вечерком расскажу.
PM MAIL   Вверх
Earnest
Дата 20.4.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Может, стоит попробовать ловить на нужнем уровне, т.е. не WH_GETMESSAGE, а WH_MOUSE?


--------------------
...
PM   Вверх
likenix
Дата 20.4.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Earnest, мне известно сообщения от мыши синхронные и ставятся в очередь на исполнение и WH_GETMESSAGE ловит все поставленные в очередь сообщения не только от мыши конечно. Но все равно не помогает ;)
PM MAIL   Вверх
Albor
Дата 21.4.2009, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Может нужную обработку сделать внутри msghook, не отсылая сообщения кому-либо ещё. Во всяком случае, просто попробовать.

Это сообщение отредактировал(а) Albor - 21.4.2009, 06:57
PM MAIL ICQ   Вверх
Andrey44
Дата 21.4.2009, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Цитата(likenix @  20.4.2009,  03:40 Найти цитируемый пост)
Но вот в чем проблема: при получении фокуса прога, которой я должен слать свои сообщения, обрабатывает сообщения и в мою библиотеку ничего не приходит. 

А когда прога не в фокусе все работает?

Цитата(Albor @  21.4.2009,  06:56 Найти цитируемый пост)
Может нужную обработку сделать внутри msghook

А смысл? Если сообщение должна обрабатывать другая прога!
Если дебагером попадает в нужные кейсы.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Albor
Дата 21.4.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(Andrey44 @  21.4.2009,  06:05 Найти цитируемый пост)
А смысл? Если сообщение должна обрабатывать другая прога!

Я бы искал причину примерно так.  Этим я бы избежал очереди сообщений. Во всяком случае, перехваченное сообщение  на выходе msghook было бы уже изменено. А как система распоряжается сообщениями по PostMessage, чья процедура первой обработает это сообщение, наверное приоритет будет отдан процедуре активного окна, для которого это сообщение.
PM MAIL ICQ   Вверх
likenix
Дата 21.4.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



О приложении, которым хочу управлять - это прога использует DirectX9/Direct3D  при получении фокуса захватывает курсор и не дает ему вылезти за пределы окна в общем как 3d гамеса
Нашел возможное решение моей проблемы Direct3D Hook Starter-Kit v1.0 но не знаю не производителя и не знаю платный или бесплатный продукт. Если кто юзал поделитесь опытом и если бесплатный поделитесь софтиной. Извините что с самого начала это не обозначил. Так как не придал этому большого значения.

>А когда прога не в фокусе все работает?
На Notepad и др приложениях тестировал - работает.
PM MAIL   Вверх
Andrey44
Дата 21.4.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Цитата(Albor @  21.4.2009,  09:57 Найти цитируемый пост)
наверное приоритет будет отдан процедуре активного окна, для которого это сообщение. 

likenix не шлет сообщения всем окнам, а окну HWND которого он знает 
Код

PostMessage(hWndServer, UWM_LBUTTONDOWN, wParam, lParam);

Так что процедура активного другого окна тут не причем.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
likenix
Дата 21.4.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



>Так что процедура активного другого окна тут не причем.
Ы это я так между делом упомянул, ясное дело что оно здесь не причем.

Главное перехватить сообщения от мыши из проги, которая под Direct3d воркает!!! АХАХА
Повторяю: "Это главное"

Ну так кто -нибудь чего-нибудь знает про Direct3D Hook Starter-Kit v1.0 ?
PM MAIL   Вверх
Albor
Дата 21.4.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(Andrey44 @  21.4.2009,  09:50 Найти цитируемый пост)
Так что процедура активного другого окна тут не причем.

Я может не правильно высказался, но перехваченное сообщение передаётся с помощью PostMessage, тот кто отправил сообщение не ждёт его обработки и продолжает свою работу, следовательно, если сообщение не обработано другой программой, оно в не изменённом виде пройдёт к своему прямому адресату.

PM MAIL ICQ   Вверх
likenix
Дата 21.4.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Код

Я может не правильно высказался, но перехваченное сообщение передаётся с помощью PostMessage, тот кто отправил сообщение не ждёт его обработки и продолжает свою работу, следовательно, если сообщение не обработано другой программой, оно в не изменённом виде пройдёт к своему прямому адресату.


Я Вас понял. )))

Просто чтобы вот это обсуждать.

Код

     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;
     }


нужно перехватить сообщение от мыши например например нажатие левой кнопки мыши, когда прога которой я должен передавать свои сообщения активна.

Надо наверное пояснить:

Есть прога ("а"(mfc only) + библиотека "б"(mfc only)) - мои программы
Прога "а" работает с библиотекой "б"
библиотекой "б" пытается перехватывать сообщения, но как видно не всегда удается )))
Если перехватывает проге "а" она их анализирует и посылает свои измененные сообщения проге "в"

Есть еще мега  програ"в" название которой я сказать не могу она работает с Direct3d
И вот как только она становится активной глушит нафиг все сообщения от мыши и моя библа их не получает (((

Вот после долгих размышлений я погуглил и наткнулся на Direct3D Hook Starter-Kit v1.0. Но пока ХЗ где его взять и как оно работает.

так что пока до PostMessage дело не дошло

надо сначало мне перехватить сообщения ))) Сори если повторяюсь А уж потом проанализировав перехваченные сообщения слать свои при помощи метода PostMessage.

Вот какая была идея.


Это сообщение отредактировал(а) likenix - 21.4.2009, 12:06
PM MAIL   Вверх
Albor
Дата 21.4.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(likenix @  21.4.2009,  10:56 Найти цитируемый пост)
Есть еще мега  програ"в"

После запуска этой проги Hook не срабатывает. Правильно я понял? 

PM MAIL ICQ   Вверх
likenix
Дата 21.4.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 13.10.2008

Репутация: нет
Всего: нет



Код

После запуска этой проги Hook не срабатывает. Правильно я понял? 


Не совсем.
Во время запуска фокус у проги само собой "в" (хук не работает) переключаемся через ALT+TAB(прога "в"не дает мышке уйти за пределы своего окна так что переключаемся по ALT+TAB) на др прогу (хук работает).
Хук перестает работать, как только прога "в" получает фокус.
После передачи фокуса другой проге хук опять работает.

Вот так вот. Так что мои подозоения что дело именно в Direc3d все больше оправдываются. Наверное ;)

Это сообщение отредактировал(а) likenix - 21.4.2009, 13:42
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.