Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hook и SendMessage в нем, почему приложение не получает SendMessag 
V
    Опции темы
qweasd
Дата 6.4.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Пытаюсь отловить сообщение таким способом:
Код

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, 08:15
PM MAIL   Вверх
qweasd
Дата 7.4.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Если чего невнятно описал - спрашивайте!

Это сообщение отредактировал(а) qweasd - 7.4.2009, 09:35
PM MAIL   Вверх
ksili
Дата 7.4.2009, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

SendMessage(g_hMainWnd,HM_KEYPRESSED,wParam,lParam);

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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
qweasd
Дата 7.4.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Я поставил перед этой строчкой MessageBox.... - и оно отображалось тогда когда надо.
Да и меседж отлавливался программой но только тогда когда диалог в фокусе!
PM MAIL   Вверх
qweasd
Дата 7.4.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) qweasd - 7.4.2009, 20:49
PM MAIL   Вверх
dumb
Дата 8.4.2009, 04:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: нет
Всего: 158



qweasd, твои глобальные переменные будут проинициализированны только в той "копии" dll, которая подгружается к процессу, вызывающему h_Init.
при подгрузке dll в другие процессы эти данные остаются 0. соответственно, либо располагай эти данные в shared-сегменте, либо делай для них именованный MMF, либо какой-нибудь FindWindow, итд итп.
PM MAIL   Вверх
qweasd
Дата 8.4.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 28.10.2006

Репутация: нет
Всего: нет



Огромное спасибо dumb!

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

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

Код

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


Это сообщение отредактировал(а) qweasd - 9.4.2009, 11:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0930 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.