Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
  |   | 
Не совсем правильно  23.11.06 19:05  Число просмотров: 1447
 Автор: Neznaika <Alex> Статус: Member
 | 
 
1) У тебя есть глобальные переменные, типа - 
 static HWND  hwndParent;
 
 Когда твоя Dll мапится в адресное пространство другого процесса, 
 то все глобальные переменные будут равны 0. Поэтому
 PostMessage( hwndParent, ..
 
 превращается в 
 PostMessage( 0, ..
 
 2) Все глобальные переменные (которые static) - 
 надо хранить в shared section.
 | 
 
| 
<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
 | 
 
| 
 | 
 
 
  
 
 | 
 |