ОБСУЖДЕНИЕ

Sendmessage и Dll

2 ответов 4,9 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Есть длл (хук), есть ехе (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 использовать?
 
о уже всё понял
<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;
}
 
ой ещё вопрос
в чём разница объявления (работает так и так )

Ни в чём. afx_msg ничего не добавляет к объявлению, и вроде нужен только для класс визарда, чтобему болезному было легче.
 
Статус
Закрыто для дальнейших ответов.