Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как ловить мышь?


Автор: Hamilion 8.4.2006, 20:54
Какое сообщение надо перехватывать (если такое вообще имеется), чтобы отследить движение мыши вне окна? Не вне клиентской области а именно вне окна?

Автор: Fixin 8.4.2006, 20:56
SetCapture

Автор: Fin 8.4.2006, 21:03
Как сказал Fixin, с помошью SetCapture захватываеш ввод мыши. Все сообшения от неё будут идти на твое окно. Тут есть подводные камни. Другие окна не будут получать данные сообшения. Второй подводный камень, другие приложения могут с легкостью перехватить мышь, вызвав функцию.
Второй способ перехвата действий мыши, это хуки.

Автор: Hamilion 8.4.2006, 21:34
А хуки это больно?

Автор: Hamilion 8.4.2006, 23:56
Где бы найти толковый пример по нукам... smile

Автор: Fin 9.4.2006, 00:16
Ну более подробно MSDN и книга Д.Рихтера "Windows - для проффессионалов"
Вот пример я выдрал из своего проекта:
AppDLL.h
Код

/********************************************************************
Module  :   AppDll.h
Subject :   <
********************************************************************/

#ifndef DLLLOADAPI
#define DLLLOADAPI extern "C" __declspec(dllimport)
#endif
#include <windows.h>
//-------------------------------------------------------------------
DLLLOADAPI LRESULT CALLBACK MouseProc(

    int nCode,    // hook code
    WPARAM wParam,    // message identifier
    LPARAM lParam    // mouse coordinates
   );

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


AppDll.cpp
Код

/********************************************************************
Module  :   AppDll.cpp
Subject :   <
********************************************************************/

#define DLLLOADAPI extern "C" __declspec(dllexport)
#include "AppDLL.h"
UINT WM_RECTLEAVE;
LRESULT CALLBACK MouseProc(

    int nCode,    // hook code
    WPARAM wParam,    // message identifier
    LPARAM lParam    // mouse coordinates
   )
{
    MOUSEHOOKSTRUCT * mc= (MOUSEHOOKSTRUCT *) lParam;
    static HWND hwnd=0;
    if (hwnd != 0)
    {
        if (hwnd != mc->hwnd)                 // || (!PtInRect(&rect,mc->pt)))
        {
            PostMessage(hwnd,WM_RECTLEAVE,0,0);
            hwnd=mc->hwnd;
        }
    }
    else hwnd=mc->hwnd;

    return CallNextHookEx(NULL,nCode,wParam,lParam);
}

BOOL WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*)
{

    switch( reason )
   {
        case DLL_PROCESS_ATTACH:
            WM_RECTLEAVE=RegisterWindowMessage("WM_RECTLEAVE");
           // Initialize once for each new process.
           // Return FALSE to fail DLL load.
           break;

      case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

      case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

      case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

AppDll.def
Код

LIBRARY     AppDll

DESCRIPTION 'Aplication DLL'

EXPORTS
            MouseProc                      @1 


Ну и сама иницилизация хука в теле программы
Код

    AppDll=LoadLibrary("AppDll.dll");
    if (AppDll !=NULL)
    {
    typedef LRESULT (CALLBACK *TMouseProc)(int, WPARAM, LPARAM);
    hook = SetWindowsHookEx(WH_MOUSE, (TMouseProc) GetProcAddress(AppDll,"MouseProc"),AppDll,0);
    }


Ну и убийство онного
Код

if (hook !=NULL) UnhookWindowsHookEx(hook);
    hook=NULL;
    if (AppDll !=NULL) FreeLibrary(AppDll);

Автор: Hamilion 9.4.2006, 11:05
Ясно, спасибо, будем разбираться с dll-ми...

Автор: dartan 26.9.2011, 16:47
Fin спасибо огромное за пример! Ты даже не представляешь как ты выручил с этим MOUSEHOOKSTRUCT * mc= (MOUSEHOOKSTRUCT *) lParam;, в мсдн то написано что мол в лпарам есть указатель на структуру а вот что б тип привести знаний в сях не хватает... примеры всегда намного нагляднее любой теории)

Автор: borisbn 27.9.2011, 10:40
 smile 
Название темы улыбнуло. Для решения проблемы может помочь моя аватарка smile

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