Re[2]: Global Mouse Hook
От: Аноним  
Дата: 18.06.08 18:52
Оценка:
Здравствуйте, VoidEx, Вы писали:
VE>Из-за (1) у вас возвращается нуль, а из-за (2) — обращение по этому нулю.
Большое спасибо за помощь! Dll загружается, но хук все же не работает ...
Может быть у кого-нибудь есть что подсказать.

Вот мой конечный вариант кода:

--- код dll [сборка в MS VS2005] ---

// mousehook.cpp : Defines the entry point for the DLL application.

#include "stdafx.h"

#pragma data_seg(".hdata") // секция в памяти общая для всех процессов
HWND hWndServer = NULL; // эта переменная может изменяться любым процессом, поэтому здесь не д.б. ничего лишнего
#pragma data_seg() // конец секции
#pragma comment(linker, "/section:.hdata,rws") // даем права этой секции

#ifdef __cplusplus 
#define EXPORT extern "C" __declspec(dllexport) 
#else 
#define EXPORT __declspec(dllexport) 
#endif

// объявление функции обратного вызова
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam);

// глобальные переменные
HHOOK HookHandle; 
HINSTANCE DllInstance; 

#ifdef _MANAGED
#pragma managed(push, off)
#endif
//----------------------------------------------------------------------
EXPORT BOOL InstallMouseHook(HWND AWnd) {    
    if(hWndServer != NULL)
        return false;
    
    HookHandle = SetWindowsHookEx(WH_GETMESSAGE, 
        reinterpret_cast<HOOKPROC>(MouseProc), DllInstance, NULL);

    HookHandle = SetWindowsHookEx(WH_MOUSE, 
        reinterpret_cast<HOOKPROC>(MouseProc), DllInstance, NULL);
    
    if(HookHandle == NULL)
        return false;
    return true;
 } 
//----------------------------------------------------------------------
EXPORT BOOL RemoveMouseHook(HWND AWnd //окно, чей хук должен быть снят
                            )
{ 
    if(AWnd != hWndServer)
        return false;
    
    BOOL unhooked = UnhookWindowsHookEx(HookHandle);
    if(unhooked)
        hWndServer = NULL;
    return unhooked;
 } 
//----------------------------------------------------------------------
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) { 
    if(code < 0) { 
        CallNextHookEx(HookHandle, code, wParam, lParam);
        return 0;
    }

    LPMSG msg = (LPMSG)lParam;

    if( (hWndServer = FindWindow(L"TForm1", L"Form1")) == NULL )
        return 0;
    else {
        if(msg->message == WM_LBUTTONDOWN || msg->message == WM_LBUTTONUP ||
            msg->message == WM_RBUTTONDOWN || msg->message == WM_RBUTTONUP )
            PostMessage(hWndServer, msg->message, 0, 0); 
    }
   
    // вызываем следующий хук в цепи 
    return CallNextHookEx(HookHandle, code, wParam, lParam); 
 }
//----------------------------------------------------------------------
BOOL APIENTRY DllMain( HMODULE hModule,   // дескриптор экземпляра DLL
                       DWORD  reason,     // причина вызова
                       LPVOID lpReserved  // зарезервировано
                     )
{
    // вызывается каждый раз когда новый процесс грузит DLL в свою память
    if( reason == DLL_PROCESS_ATTACH ) {
        if( ! hWndServer ) {
            // cохраняем дескриптор экземпляра, он понадобится позднее для установки хука
            DllInstance = hModule;
            return true;
        }
    } else if( reason == DLL_PROCESS_DETACH ) {
        if( hWndServer != NULL )
            RemoveMouseHook(hWndServer);// ЕСЛИ сервер не снял хук, снимем его
        return true;
    }
    return TRUE;
}
//----------------------------------------------------------------------
#ifdef _MANAGED
#pragma managed(pop)
#endif


--- исполняемое приложение — сервер [сборка в C++Builder 6.0] ---

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "mshookmain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
typedef bool (__stdcall *MOUSEHOOKFCT)(HWND);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {
    DllHandle = LoadLibrary("mousehook.dll");
    MOUSEHOOKFCT InstHook = reinterpret_cast<MOUSEHOOKFCT>
        (GetProcAddress(DllHandle, "InstallMouseHook"));
    if( ! InstHook )
        Label1->Caption = "Unable to set hook!";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {
    MOUSEHOOKFCT RemHook = reinterpret_cast<MOUSEHOOKFCT>
        (GetProcAddress(DllHandle, "RemoveMouseHook"));
    if( ! RemHook )
        Label1->Caption = "Unable to remove hook!";

    FreeLibrary(DllHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
    switch( Msg.message ) {
        case WM_LBUTTONDOWN :
            Label2->Caption = "LEFT MOUSE BUTTON PRESSED!";
            break;
        case WM_LBUTTONUP :
            Label2->Caption = "LEFT MOUSE BUTTON RELEASED!";
            break;
        case WM_RBUTTONDOWN :
            Label2->Caption = "RIGHT MOUSE BUTTON PRESSED!";
            break;
        case WM_RBUTTONUP :
            Label2->Caption = "RIGHT MOUSE BUTTON RELEASED!";
            break;
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.