Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mouse hook, Создания хука на клик мыши 
V
    Опции темы
VOX
Дата 17.6.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте!
Подскажите пожалуйста, как реализовать хук на клик 
левой кнопки мыши.
Это необходимо для того, что бы при клике левой кнопки
мыши, даже если форма не активна, происходило событие,
к примеру вывод сообщение. Спасибо!
PM MAIL   Вверх
Keeper89
Дата 17.6.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

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

    FreeLibrary(DllHandle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
    switch( Msg.message ) {
        case WM_LBUTTONDOWN :
            Form1->Caption = "LEFT MOUSE BUTTON PRESSED!";
            break;
        case WM_LBUTTONUP :
            Form1->Caption = "LEFT MOUSE BUTTON RELEASED!";
            break;
        case WM_RBUTTONDOWN :
            Form1->Caption = "RIGHT MOUSE BUTTON PRESSED!";
            break;
        case WM_RBUTTONUP :
            Form1->Caption = "RIGHT MOUSE BUTTON RELEASED!";
            break;
    }
}

http://www.rsdn.ru/forum/winapi/2990622.1.aspx


--------------------
PM MAIL WWW   Вверх
VOX
Дата 17.6.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



OH Dll требует, вот это надо в длл превратить и подключить к проекту?
Код

#include "stdafx.h"

#pragma data_seg(".hdata") // секция в памяти общая для всех процессов
HWND hWnd = 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
//----------------------------------------------------------------------
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if( ul_reason_for_call == DLL_PROCESS_ATTACH ) {
        if( ! hWnd ) {
            DllInstance = hModule;
        }
    }
    return TRUE;
}
//----------------------------------------------------------------------
EXPORT BOOL InstallMouseHook(HWND AWnd) { 
    hWnd = AWnd;
    
    HookHandle = SetWindowsHookEx(WH_MOUSE, 
            reinterpret_cast<HOOKPROC>(MouseProc), DllInstance, NULL); 
    
    if(HookHandle == NULL)
        return false;
    return true;
} 
//----------------------------------------------------------------------
EXPORT BOOL RemoveMouseHook(void) { 
    if( UnhookWindowsHookEx( HookHandle ) == NULL )
        return false; 
    return true;
} 
//----------------------------------------------------------------------
LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam) { 
    if(code < 0) 
        return CallNextHookEx(HookHandle, code, wParam, lParam); 

    HWND h = FindWindow(L"TForm1", L"Form1");
    switch( LOWORD ( wParam ) ) {
        case WM_LBUTTONDOWN :
            PostMessage(h, WM_LBUTTONDOWN, 0, 0);
            break;
        case WM_LBUTTONUP :
            PostMessage(h, WM_LBUTTONUP, 0, 0);
            break;
        case WM_RBUTTONDOWN :
            PostMessage(h, WM_RBUTTONDOWN, 0, 0);
            break;
        case WM_RBUTTONUP :
            PostMessage(h, WM_RBUTTONUP, 0, 0);
            break;
    }
   
    // вызываем следующий хук в цепи 
    return CallNextHookEx(HookHandle, code, wParam, lParam); 
 }
//----------------------------------------------------------------------
#ifdef _MANAGED
#pragma managed(pop)
#endif


Добавлено через 2 минуты и 27 секунд
ога, только библиотечка у него в вижуале 2005 делалась,
может есть иной способ без длл
Необходимо обработать только левый клик
PM MAIL   Вверх
VOX
Дата 17.6.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ога, вот так, спасибо
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <windows.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK MouseHook;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        switch (wParam) {
            case WM_LBUTTONDOWN :
                Form1->Label1->Caption = "LEFT BUTTON PRESSED";
                break;
            case WM_RBUTTONDOWN :
                Form1->Label1->Caption = "RIGHT BUTTON PRESSED";
                break;
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStopHookClick(TObject *Sender) {
    UnhookWindowsHookEx(MouseHook);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender) {
    MouseHook = SetWindowsHookEx(WH_MOUSE_LL,
        reinterpret_cast<HOOKPROC>(LowLevelMouseProc), HInstance, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) {
    UnhookWindowsHookEx(MouseHook);
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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