Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Hook и SendMessage в нем


Автор: qweasd 6.4.2009, 00:28
Пытаюсь отловить сообщение таким способом:
Код

LRESULT CSongCatcherDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == HM_KEYPRESSED)
        MessageBox(_T("Abirvalg"));
    return CDialog::DefWindowProc(message, wParam, lParam);
}


Hook.dll:
Код

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "hook.h"

HANDLE g_hMod;
HHOOK g_hhookKbd;
HWND g_hMainWnd;

LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam);
#define HM_KEYPRESSED WM_USER+200

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    g_hMod = hModule;

    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


void h_Init(HWND hWnd)
{
    g_hMainWnd = hWnd;
    g_hhookKbd = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,(HINSTANCE)g_hMod,0);
 }

void h_Release ()
{
    UnhookWindowsHookEx(g_hhookKbd);
}


LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    
    if (nCode == HC_ACTION && !(lParam & 0x80000000))
    {
        if ((GetKeyState(VK_LCONTROL) & 0x8000)
            && (GetKeyState(VK_LSHIFT) & 0x8000)
            && (GetKeyState(0x31) & 0x8000))        // 1 key
        {
             SendMessage(g_hMainWnd,HM_KEYPRESSED,wParam,lParam);
        }
    }
    return CallNextHookEx(g_hhookKbd,nCode,wParam,lParam);
}


проинициализировал так:
Код

BOOL CSongCatcherDlg::OnInitDialog()
{
    ...
    h_Init(this->m_hWnd);
            ...
    return TRUE;  // return TRUE  unless you set the focus to a control
}


почему приложение получает сообщение только когда оно активно и не получает когда не активна хотя хукер срабатывает??


Автор: qweasd 7.4.2009, 09:34
Если чего невнятно описал - спрашивайте!

Автор: ksili 7.4.2009, 09:53
"Хукер срабатывает" это имеется в виду, что управление попадает на строчку 
Код

SendMessage(g_hMainWnd,HM_KEYPRESSED,wParam,lParam);

или то, что оно просто попадает в HookProc? 

А-то ведь если управление попадает в HookProc, это не значит что 100% выполнится строка с SendMessage... какое-то из условий может и не выполниться

Автор: qweasd 7.4.2009, 13:13
Я поставил перед этой строчкой MessageBox.... - и оно отображалось тогда когда надо.
Да и меседж отлавливался программой но только тогда когда диалог в фокусе!

Автор: qweasd 7.4.2009, 20:40
Заметил еще такую особеность: добавил в хукдллку код вызова мессадж бокса при нажатии комбинации - так вот это окно отображается с использованием ресурсов того приложения которое в данный момент в фокусе - тоесть если я в фокус ставлю винамп у месаджбокса в заголовке окна стиот значек винампа и так со всеми окнами (((
Да и забыл указать дллку подключаю через либ файл!

Автор: dumb 8.4.2009, 04:13
qweasd, твои глобальные переменные будут проинициализированны только в той "копии" dll, которая подгружается к процессу, вызывающему h_Init.
при подгрузке dll в другие процессы эти данные остаются 0. соответственно, либо располагай эти данные в shared-сегменте, либо делай для них именованный MMF, либо какой-нибудь FindWindow, итд итп.

Автор: qweasd 8.4.2009, 23:18
Огромное спасибо dumb!

Когда чуть раньше написал такуюже дллку и загружал её в проект C# то все работалj и без shared-сегмента(интерестно почему?)

Сделал так, и все заработало:

Код

#pragma data_seg(".JOE")
HWND g_hMainWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.JOE,rws")

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)