Проблема с вызовом функции...
От: pitomnik  
Дата: 22.12.02 15:15
Оценка:
Здравствуйте!

Прижеденный ниже код используется для отлавливания клика мыши во всей системе.
Хук ставится из EXE, написанного на VB.
Закомментированная строка посылает основному окну сообщения о каждом клике.
Однако, заманчиво делать простой вызов функции, находящейся в стандартном
модуле VB программы вместо сабклассинга. Тут появляется проблема.
Код работает только при кликание на своем окне. При переходе в другое перестает
(также и при возврате обратно в свое окно).

Где я ошибаюсь?

Спасибо.



typedef void (__stdcall *FUNCPTR)(long hWnd) ;

#pragma data_seg(".shared")
HHOOK m_hHook = 0 ;
HWND m_hOwner = 0 ;
FUNCPTR m_hCallback = 0 ;
#pragma data_seg()


LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
{
CallNextHookEx(m_hHook, nCode, wParam, lParam) ;
return 0 ;
}

if (nCode == HC_ACTION)
{
if (wParam == WM_LBUTTONUP || wParam == WM_NCLBUTTONUP)
{
m_hCallback(long(((MOUSEHOOKSTRUCT*) lParam)->hwnd)) ;
//PostMessage(m_hWnd, WM_USER + WM_LBUTTONUP, long(((MOUSEHOOKSTRUCT*) lParam)->hwnd), 0) ;
}
}

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

void WINAPI SetValues(HHOOK hHook, HWND hOwner, long hCallback)
{
m_hHook = hHook ;
m_hOwner = hOwner ;
m_hCallback = (FUNCPTR)hCallback ;
}
Re: Проблема с вызовом функции...
От: m.a.g. Мальта http://dottedmag.net/
Дата: 22.12.02 15:23
Оценка:
Здравствуйте, pitomnik, Вы писали:

P>Код работает только при кликание на своем окне. При переходе в другое перестает

P>(также и при возврате обратно в свое окно).

DLL существует в адресном пространстве того процесса, в котором произошло событие, перехваченное хуком. Соответственно, все локальные и глобальные переменные содержат мусор. Есть решения — завести в системе адресуемую сущность — очередь сообщений или именованную трубу, и через не данные пропихивать, или создать shared-секцию в dll, разделяемую всеми dll, и в ней хранить нужные данные — хендл она или что еще.

2moder: перемести в win32api, plz.
... << np:silent >> ...
Re[2]: Проблема с вызовом функции...
От: pitomnik  
Дата: 22.12.02 18:11
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>Здравствуйте, pitomnik, Вы писали:


P>>Код работает только при кликание на своем окне. При переходе в другое перестает

P>>(также и при возврате обратно в свое окно).

MAG>DLL существует в адресном пространстве того процесса, в котором произошло событие, перехваченное хуком. Соответственно, все локальные и глобальные переменные содержат мусор. Есть решения — завести в системе адресуемую сущность — очередь сообщений или именованную трубу, и через не данные пропихивать, или создать shared-секцию в dll, разделяемую всеми dll, и в ней хранить нужные данные — хендл она или что еще.


MAG>2moder: перемести в win32api, plz.


Спасибо за отклик!

Хочу обратить ваше внимание на то, что все необходимые
данные находятся в shared секции: хэндлер хука и адрес
функции. Плюс еще раз повторю, что с PostMessage код
работает 100% корректно.
Re[3]: Проблема с вызовом функции...
От: m.a.g. Мальта http://dottedmag.net/
Дата: 23.12.02 07:37
Оценка:
Здравствуйте, pitomnik, Вы писали:

P>Спасибо за отклик!

Да не за что

P>Хочу обратить ваше внимание на то, что все необходимые

P>данные находятся в shared секции: хэндлер хука и адрес
P>функции. Плюс еще раз повторю, что с PostMessage код
P>работает 100% корректно.

Только при вызове в чужом адресном пространстве указатель на функцию указывает куда-то в область процесса, в котором мы сейчас выполняемся, и, разумеется, никакой нашей функции-обработчика там нет. Так что взаимодействие придется организовывать через какие-либо системные примитивы.
... << @@wamp >> ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.