Sendmessage и Dll

Тема в разделе "Общие вопросы по С и С++", создана пользователем solova, 9 апр 2011.

Статус темы:
Закрыта.
  1. solova

    solova Гость

    Есть длл (хук), есть ехе (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 использовать?
     
  2. solova

    solova Гость

    о уже всё понял
    <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;
    }
     
  3. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Ни в чём. afx_msg ничего не добавляет к объявлению, и вроде нужен только для класс визарда, чтобему болезному было легче.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей