В чём бага? Пытаюсь отловить сообщение hook'ом...
//---------------------------------------------------------------------------
#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, такая же фигня! =(
Помогите плз, или подскажите альтернативный метод перехвата сообщений, лучше даже для конкретного окна обращаясь к нему через дескриптор...
Заранее спасибо!
Цитата:
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, такая же фигня! =(
Помогите плз, или подскажите альтернативный метод перехвата сообщений, лучше даже для конкретного окна обращаясь к нему через дескриптор...
Заранее спасибо!
Вот код:
//---------------------------------------------------------------------------
#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)')
HookProc к тому же должна находиться в DLL.
ДЛЛ:
.....
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);
.....
Писал по памяти, так что за ошибки - сорри...
;)