| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  |  |  | Спасибо  23.11.06 19:17  Число просмотров: 1345 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 23.11.06 19:23  Количество правок: 1
 |  
|  |  | <programming> |  
| [Win32] Проблема с Windows Hooks  23.11.06 15:57 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 23.11.06 18:53  Количество правок: 2
 |  
| Опять я к вам за помощью. Такая проблема. Пишу программу для перехвата данных из диалоговых элементов. Установил глобальный хук WH_GETMESSGAE (перехватчик находится в DLL). Ловлю сообщения связанные с нажатием мыши. Перехват срабатывает только в пределах созаднного мной окна, хтотя WM_KEYUP ловит исправно. Кто-нибудь знает, как поймать все сообщения от мыши? В принципе могу код выложить. 
 Может у кого ссылки на тему есть?
 |  
|  | И ещё один вопрос. Не по теме. Может есть какие-нибудь теги...  23.11.06 18:58 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 |  
| И ещё один вопрос. Не по теме. Может есть какие-нибудь теги для оформления исходных кодов, а то прямым текстом никакой структуры не видно :( |  
|  |  | <без заголовка>  23.11.06 19:07 Автор: ZloyShaman <ZloyShaman> Статус: Elderman
 Отредактировано 23.11.06 19:08  Количество правок: 1
 |  
|  |  
|  |  |  | Спасибо  23.11.06 19:17 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 23.11.06 19:23  Количество правок: 1
 |  
|  |  
|  | Новости с фронта... Если вставить MessageBeep в DLL, то...  23.11.06 18:50 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 23.11.06 19:40  Количество правок: 6
 |  
| Новости с фронта... Если вставить MessageBeep в DLL, то видно, что перехватчик работает и за пределами "своего" приложения. Есть подозрение, что PostMessage не доставляет сообщение окну hwndParent. Буду признателен за помощь. 
 
 
/*****************spy.cpp
#include <windows.h>
#include "resource.h"
#include "msghook.h"
#pragma comment (lib, "msghook.lib")
BOOL CALLBACK Spy(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch (iMsg)
    {
    case WM_INITDIALOG:
        InstallHook(hDlg);
        return TRUE;
    case WM_SPY_LBUTTONDOWN:
    case WM_SPY_LBUTTONUP:
        MessageBeep(MB_ICONASTERISK);
        return TRUE;
    case WM_CLOSE:
        UninstallHook();
        EndDialog (hDlg, 0);
        return TRUE;
    } // switch (iMsg) ...
    return FALSE;
} // Spy
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    DialogBox (hInst, "Spy", NULL, Spy);
    return 1;
}
/*****************msghook.cpp
static HHOOK hhookGetMsg;	// Значение устанавливает главная программа
static HWND  hwndParent;	// Хэндл окна установившего перехватчик
static HINSTANCE hinstDLL;	// Хэндл этой DLL
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD fdwReason, LPVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
        hinstDLL = hDll;
    return TRUE;
}
EXPORT void InstallHook(HWND hwnd)
{
    hwndParent = hwnd;
	
    hhookGetMsg = SetWindowsHookEx(
                      WH_GETMESSAGE,	// Перехват сообщений оконной процедуре
                      GetMsgProc,	// Перехватчик
                      hinstDLL,		// DLL перехватчика
                      0);		
}
EXPORT void UninstallHook()
{
    UnhookWindowsHookEx(hhookGetMsg);
}
EXPORT LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    POINT	pt;		// Текущее положение указателя мыши
    HWND	hwndCtrl;	// Текущее окно
    MSG *msg = (MSG *) lParam;	// Перехваченное сообщение
    CallNextHookEx(hhookGetMsg, nCode, wParam, lParam);
    switch (msg->message)
    {
    case WM_LBUTTONDOWN:
        PostMessage(hwndParent, WM_SPY_LBUTTONDOWN, 0, (LPARAM) msg->hwnd);
        break;
    case WM_LBUTTONUP:
        PostMessage(hwndParent, WM_SPY_LBUTTONUP, 0, (LPARAM) msg->hwnd);
        break;
    }
    return NULL;
}
---
 |  
|  |  | Не совсем правильно  23.11.06 19:05 Автор: Neznaika <Alex> Статус: Member
 |  
| 1) У тебя есть глобальные переменные, типа - static HWND  hwndParent;
 
 Когда твоя Dll мапится в адресное пространство другого процесса,
 то все глобальные переменные будут равны 0. Поэтому
 PostMessage( hwndParent, ..
 
 превращается в
 PostMessage( 0, ..
 
 2) Все глобальные переменные (которые static) -
 надо хранить в shared section.
 |  
|  |  |  | Ты про это? Тоже не хочет...  23.11.06 19:14 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 23.11.06 20:03  Количество правок: 3
 |  
| Ты про это? Тоже не хочет... 
 #pragma data_seg("Shared")
 
 HHOOK hhookGetMsg;	// Значение устанавливает главная программа
 HWND  hwndParent;	// Хэндл окна установившего перехватчик
 HINSTANCE hinstDLL;	// Хэндл этой DLL
 
 #pragma data_seg()
 #pragma comment(linker, "/section:Shared,rws")
 
 Хм... А секции .bss в DLL нету. В чём касяк? Компилю MS Visual C++ 6.0
 |  
|  |  |  |  | Перед тем, как сделать PostMessage  23.11.06 20:05 Автор: Neznaika <Alex> Статус: Member
 |  
| пиши куда-нибудь в лог hhookGetMsg, hwndParent и hinstDLL. 
 Сразу будет видно, когда они равны нулю.
 |  
|  |  |  |  |  | Логи вести не стал. И так стало ясно, что hwndParent...  24.11.06 03:57 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 |  
| Логи вести не стал. И так стало ясно, что hwndParent обнуляется везде кроме "родного" приложения. Всем спасибо. Решение нашлось:
 
 #pragma bss_seg("shared")
 
 HHOOK hhookGetMsg;		// Значение устанавливает главная программа
 HWND  hwndParent;		// Хэндл окна установившего перехватчик
 HINSTANCE hinstDLL;		// Хэндл этой DLL
 
 #pragma comment(linker, "/section:shared,rws")
 |  
|  | В пределах твоего окна -- или в пределах твоего приложения?  23.11.06 18:49 Автор: Neznaika <Alex> Статус: Member
 |  
|  |  
|  |  | У меня приложение из одного окна. Или я не про то?  23.11.06 18:51 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 |  
|  |  
 
 
 |  |