Sendmessage и Dll

  • Автор темы solova
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

solova

#1
Есть длл (хук), есть ехе (MFC, для запуска хука)
Хук отслеживает закрытие определённого окна и должен послать моему ехе месадж
ехе принимает мессадж и запускает некий обработчик, который закрывает программку ехе
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Обработчик(CexeDlg.cpp)</div></div><div class="sp-body"><div class="sp-content">
C++:
BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialog)
ON_MESSAGE		(WM_MYMESSAGE,		OnDllMSG)
//...
END_MESSAGE_MAP()
// В длл-ку я передаю HWND моего ехе (InstalHook(GetWindowThreadProcessId(hWndTarget,NULL),[b]m_hWnd[/b]);)
void CtestdDlg::OnDllMSG()
{
//...
PostQuitMessage(0);
}
Вопрос первый:нужно объявить #define WM_MYMESSAGE WM_USER+23, так вот где? в этом же файле?
Пс: я что то пытался сделать но мне писало ошибку <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Ошибка</div></div><div class="sp-body"><div class="sp-content">Error 1 error C2440: 'static_cast' : cannot convert from 'void (__thiscall CtestDlg::* )(void)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' ссылаясь на строчку ON_MESSAGE.
коды Длл<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Hook.h</div></div><div class="sp-body"><div class="sp-content">
C++:
#ifdef HOOK_EXPORTS
#define HOOK_API __declspec(dllexport)
#else
#define HOOK_API __declspec(dllimport)
#endif
#define WM_MYMESSAGE WM_USER+23
static HHOOK hHook = NULL;
static HANDLE hDll = NULL;
static DWORD dwThread = NULL;
static HWND hButt;
HOOK_API BOOL InstallHook(DWORD dwThrd,HWND hProg);
HOOK_API BOOL RemoveHook(void);
LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam);
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Hook.cpp</div></div><div class="sp-body"><div class="sp-content">
C++:
#include "Bithook.h"

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:hDll = hModule;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;}
return TRUE;}
HOOK_API BOOL RemoveHook(void){UnhookWindowsHookEx(hHook);return TRUE;}
HOOK_API BOOL InstallHook(DWORD dwThrd,HWND hProg){
hButt = hProg;
hHook = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,(HINSTANCE)hDll,dwThrd);
return TRUE;}

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *cwp=(CWPSTRUCT*)lParam;
if(cwp->message== WM_CLOSE)
{
UnhookWindowsHookEx(hHook);
////////////////////вариант первый
HWND testik=::FindWindow(NULL,L"test");
SendMessage(testik,WM_MYMESSAGE,0,0);
////////////////////вариант второй
SendMessage(hButt,WM_MYMESSAGE,0,0);
//и оба не работают
MessageBox(0,L"Произошло закрытие",L"От Хука",0);
}
if ((cwp->message==WM_COMMAND)&&(LOWORD(cwp->wParam)==32578))
{
MessageBox(0,L"Была нажата кнопка Обновить",L"От Хука",0);
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
return TRUE;}
Ну и основной вопрос: Как всё это реализовать?

Может postmessage использовать?
 
S

solova

#2
о уже всё понял
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
C++:
.h файл
public:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

...
.cpp файл
#define WM_MYMESSAGE (WM_USER + 100)

BEGIN_MESSAGE_MAP(CMyWnd, CMyParentWndClass)
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

LRESULT CMyWnd::OnMyMessage(WPARAM WParam, LPARAM LParam)
{
//обработка
return 0;
}
ой ещё вопрос
в чём разница объявления (работает так и так )
C++:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
и
C++:
LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
нет возможности поверить но можно ли сделать так(на два сообщения)<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
C++:
.h файл
public:
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

...
.cpp файл
#define WM_MYMES (WM_USER + 100)
#define WM_MYMESSAGE (WM_USER + 101)

BEGIN_MESSAGE_MAP(CMyWnd, CMyParentWndClass)
ON_MESSAGE(WM_MYMESSAGE, 	 OnMyMessage)
ON_MESSAGE(WM_MYMES,	 	 OnMyMessage)
END_MESSAGE_MAP()

LRESULT CMyWnd::OnMyMessage(WPARAM WParam, LPARAM LParam)
{
switch(lParam)
{
case WM_MYMES:
//обработка
break;
case WM_MYMESSAGE:
//обработка
break;
}
return 0;
}
 
Статус
Закрыто для дальнейших ответов.