C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Хук в ХР работает, а в 98-м нет
Андрей
  Отправлено: 27.05.2003, 21:59


Не зарегистрирован







Народ, помогите разобраться.
По статье Шевелева, взятой с этого сайта пробую организовать хук Клавы(Сtrl+Alt),
После нажатия должно пикнуть. Правда, для начала я упростил его урок. Он(урок) весь был на API.
Проверил на разных компах: ХР все работает, а вот в 98 ни звука.
Поделитесь соображениями, буду рад любой помощи.

А еще подскажите, как из этого хука передать флаг в основную прогу для его обработки.


Делаю Dll

//---------------------------------------------------------------------------
#include
#pragma argsused
//-------------------------------------------------------------------------

#define UP 1
#define DOWN 2
#define RESET 3

int iAltKey; // ñîñòîÿíèå êëàâèø
int iCtrlKey;
int iNumPad_0;
int iNumPad_9;

extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardHook(int,WPARAM,LPARAM);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------

void vfBeep()
{
MessageBeep(-1);
MessageBeep(-1);
}

LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{ //Ëîâóøêà êëàâèàòóðû

if((lParam>> 31)&1) //Åñëè êë íàæàòó
switch(wParam)
{
case VK_CONTROL: iCtrlKey=UP; break; //ôëàãè ñîñòîÿíèÿ
case VK_MENU: iAltKey=UP; break;
case VK_NUMPAD0: iNumPad_0=UP; break;
}
else // Åñëè êë îòïóùåííà
switch(wParam)
{
case VK_CONTROL: iCtrlKey=DOWN; break;
case VK_MENU: iAltKey=DOWN; break;
case VK_NUMPAD0: iNumPad_0=DOWN; break;
}
if(iAltKey==DOWN && iCtrlKey == UP)
{
vfBeep();
iCtrlKey = RESET;
}
if(iAltKey==UP && iCtrlKey == DOWN)
{
vfBeep();
iAltKey = RESET;
}
if((iAltKey==UP && iCtrlKey == RESET) || (iAltKey==RESET && iCtrlKey == UP))
{
iCtrlKey = RESET;
iAltKey = RESET;
}
return 0;
}


Ставлю хук и проверяю как работает


#include
#pragma hdrstop

#include "prob_hook.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HINSTANCE hLib; // Áèáëèîòåêà ñ ëîâóøêàìè
HHOOK hKeybHook; // Ëîâóøêà
LRESULT CALLBACK (__stdcall *pKeybHook)(int,WPARAM,LPARAM);

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

void __fastcall TForm1::Button2Click(TObject *Sender)
{
//óáèðàþ ëîâóøêó
UnhookWindowsHookEx(hKeybHook);
FreeLibrary(hLib);

Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ñòàâëþ ëîâóøêó
hLib = LoadLibrary("Pr_Hook_Key.dll");
if(hLib)
{
(void*)pKeybHook = GetProcAddress(hLib, "KeyboardHook");
hKeybHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)(pKeybHook),hLib,0);
}
}
hunter
Отправлено: 02.06.2003, 16:36


Не зарегистрирован







У меня тоже самое. Кодил прогу в Xp, все в порядке. Перенес в 98 не пашет. Просит библиотеки. Если кто — то разобрался прошу мылить.
the_best_hunter@mail.ru cool.gif

Вернуться в Вопросы программирования в C++Builder