Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
Новости с фронта... Если вставить MessageBeep в DLL, то... 23.11.06 18:50 Число просмотров: 1516
Автор: 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;
}
---
|
<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
|
|
|
|