Hook na klawiature

0

Witam, mam problem z hookami w C++, zawsze zakladalem je w delphi teraz musialem sie przezucic na C++, probowalem przetlumaczyc z delphi na c++ ale nic z tego, w koncu poszukalem na googlach jakiegos kursu no i znalazlem przyklad, skopiowalem linijka po linijce do Buildera i nie mozna uruchomic, wyskakuja bledy, co jest nie tak, kod wyglada nastepujaco:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND hwnd;
HHOOK g_MyHook;
LRESULT CALLBACK AltF4Proc (int code, WPARAM wParam, LPARAM lParam)
{
	if (code < 0) return CallNextHookEx (0, code, wParam, lParam);

	if (wParam == VK_F4 && (lParam & 536870912))
	{
		MessageBox (hwnd, "Nie zamkniesz mnie tak łatwo!", NULL, MB_ICONEXCLAMATION);
        return 1;    
    }

    return CallNextHookEx (0, code, wParam, lParam);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::start(TObject *Sender)
{
 g_MyHook = SetWindowsHookEx(WH_KEYBOARD, &AltF4Proc, NULL, GetThreadId (GetCurrentThread()));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::koniec(TObject *Sender, TCloseAction &Action)
{
 UnhookWindowsHookEx(g_MyHook);
}
//---------------------------------------------------------------------------

Prosze o pomoc.

0
//---------------------------------------------------------------------------
#define STRICT
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK g_MyHook;
LRESULT CALLBACK AltF4Proc (int code, WPARAM wParam, LPARAM lParam)
{
       if (code < 0 ) return CallNextHookEx (g_MyHook, code, wParam, lParam);

        if (wParam == VK_F4 &&(lParam & 536870912))
        {
         MessageBox (NULL, "Nie zamkniesz mnie tak łatwo!", NULL, MB_ICONEXCLAMATION);
         return 1;
        }

    return CallNextHookEx (g_MyHook, code, wParam, lParam);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
 g_MyHook = SetWindowsHookEx(WH_KEYBOARD,AltF4Proc,NULL,GetCurrentThreadId());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 UnhookWindowsHookEx(g_MyHook);
}
//---------------------------------------------------------------------------
0

W takiej postaci faktycznie dziala:

//---------------------------------------------------------------------------
#define STRICT
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HHOOK g_MyHook;
LRESULT CALLBACK AltF4Proc (int code, WPARAM wParam, LPARAM lParam)
{
	  //  if (code < 0) return CallNextHookEx (0, code, wParam, lParam);
		if (wParam == VK_ESCAPE)
		{
				MessageBox (NULL, "Nie zamkniesz mnie tak łatwo!", NULL, MB_ICONEXCLAMATION);
			   // return 1;
        }

	return CallNextHookEx (g_MyHook, code, wParam, lParam);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
 g_MyHook = SetWindowsHookEx(WH_KEYBOARD,AltF4Proc, HInstance,GetCurrentThreadId());
}
//---------------------------------------------------------------------------

void __fastcall TForm1::koniec(TObject *Sender)
{
UnhookWindowsHookEx(g_MyHook);
}
//---------------------------------------------------------------------------

Tylko mam maly problem bo dopiero teraz widze ze to nie jest hook globalny, w jaki sposob to przerobic zeby lapal za kazdym razem kiedy wcisne ESC. Prosze o pomoc

0

Ten nie jest globalny
Globalny powinien zostać umieszczony w bibliotece .dll .

0

a nie da sie tego zrobic w programie, bo bibliotek dll to nie wiem jak sie robi ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1