Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В чём бага? Пытаюсь отловить сообщение hook'ом...

5.2K
08 декабря 2003 года
RomahA
7 / / 08.12.2003
Вот код:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK hk;

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MessageBox(NULL,"Hook","Hook",MB_OK);
return CallNextHookEx(hk, nCode, wParam, lParam);
}

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
hk = SetWindowsHookEx(WH_KEYBOARD,&HookProc, NULL, 0);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
UnhookWindowsHookEx(hk);
}


При компиляции вылезает такая ошибка:

[C++ Error] Unit1.cpp(72): E2034 Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
[C++ Error] Unit1.cpp(72): E2342 Type mismatch in parameter 'lpfn' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned int,long)')

Если при ссылке на HookProc не ставить амперсант &HookProc, такая же фигня! =(

Помогите плз, или подскажите альтернативный метод перехвата сообщений, лучше даже для конкретного окна обращаясь к нему через дескриптор...

Заранее спасибо!
1.8K
09 декабря 2003 года
MishaSt
170 / / 11.08.2003
Цитата:
Originally posted by RomahA
Вот код:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK hk;

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MessageBox(NULL,"Hook","Hook",MB_OK);
return CallNextHookEx(hk, nCode, wParam, lParam);
}

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
hk = SetWindowsHookEx(WH_KEYBOARD,&HookProc, NULL, 0);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
UnhookWindowsHookEx(hk);
}


При компиляции вылезает такая ошибка:

[C++ Error] Unit1.cpp(72): E2034 Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
[C++ Error] Unit1.cpp(72): E2342 Type mismatch in parameter 'lpfn' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned int,long)')

Если при ссылке на HookProc не ставить амперсант &HookProc, такая же фигня! =(

Помогите плз, или подскажите альтернативный метод перехвата сообщений, лучше даже для конкретного окна обращаясь к нему через дескриптор...

Заранее спасибо!


Да ты что, невидишь, он требует процедуру без параметров:
[C++ Error] Unit1.cpp(72): E2342 Type mismatch in parameter 'lpfn' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(int,unsigned int,long)')

424
11 декабря 2003 года
(C)dragon
307 / / 04.12.2002
HookProc к тому же должна находиться в DLL.
4.9K
13 декабря 2003 года
FLUID
8 / / 05.11.2003
Вот как делаю я:

ДЛЛ:

.....
extern "C" LRESULT CALLBACK __declspec(dllexport) MyHookProc(int nCode, WPARAM wParam, LPARAM lParam);
.....
LRESULT CALLBACK MyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//..do something...
//например, выведем сообщение по нажатию
//CTRL+END
if(nCode < 0)
return 0;
else
{
if(GetAsyncKeyState(VK_CONTROL) &&
GetAsyncKeyState(VK_END))
MessageBox(NULL,"CTRL+END Pressed","Hook",MB_OK|MB_ICONINFORMATION);
}
return 0;
}

ПРОГА:

....
HHOOK hHook;
....
typedef LRESULT CALLBACK __declspec(dllimport) MYHOOKPROC(int,WPARAM,LPARAM);
MYHOOKPROC *MyHookProc;
HINSTANCE hModule = LoadLibrary("somedll.dll");
if(hModule)
{
MyHookProc = (MYHOOKPROC *)GetProcAddress(hModule,"MyHookProc");
if(MyHookProc)
{
hHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)MyHookProc,hModule,0);
//0 - Хук на всю систему
//нужен хук только на приложение - пиши GetCurrentThreadId()
}
else
ShowMessage("Error loading function from module...");
}
else
ShowMessage("Error loading DLL");

.....
//Убираем хук...
UnhookWindowsHookEx(hHook);
.....

Писал по памяти, так что за ошибки - сорри...

;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог