Strony

sobota, 18 kwietnia 2015

Zakładanie hooka w Delphi- metoda Hot Key

Metoda Hot Key


     Poprzednio poznaliśmy metodę przechwytywania klawiatury o nazwie Key Press. Metoda Hot Key jest drugą możliwością przechwytywania klawiatury i tworzenia skrótów klawiaturowych, jaką daje nam Delphi (zakładka Tools Pallete).

     Podobnie, jak w poprzednim przypadku, do testowania naszych działań wykorzystamy stworzoną przez nas procedurę o nazwie „Opcja niedostępna”. Oprócz niej używać będziemy jeszcze procedurę WMHotKey, którą deklarujemy w sekcji Private.

     W metodzie, którą przedstawiamy, aby przyswoić któryś z klawiszy do naszych potrzeb, musimy najpierw zarejestrować go w funkcji Hot Key i przypisać polecenie, które ma zostać wykonane po jego naciśnięciu. Każdy klawisz i każda kombinacja klawiszy (skróty klawiaturowe) musi zostać osobno zarejestrowana. Rejestracji dokonujemy w procedurze Form Create. Jest to chyba oczywiste miejsce: Przechwytu klawiszy musimy dokonać razem z uruchamiającym się programem.

Spójrzmy na zapis z rejestracji pierwszego klawisza:

                             RegisterHotKey(Handle,$0001,0,VK_F1)

     Polecenie „RegisterHotKey” mówi samo za siebie: „zarejestruj skrót klawiaturowy”. Po słowie Handle mamy identyfikator tego skrótu, który jest liczbą kolejną, począwszy od pierwszej, czyli 0001. Jak widzimy po tej sekcji, w sumie zarejestrowaliśmy 171 różnych klawiszy i ich kombinacji. Po identyfikatorze umieszczamy kod klawisza lub klawiszy, które chcemy przejąć. Nie spotkaliśmy się jeszcze z taką formą identyfikowania klawiszy. Jest ona drugim, równorzędnym sposobem oznaczania klawiszy. Po literach „VK” wpisujemy słowną nazwę klawisza, oczywiście w języku angielskim, który w środowisku Delphi obowiązuje. Chcąc zatem przejąć dany klawisz, musimy wiedzieć, jak się on nazywa. W materiałach pomocniczych do Delphi odnajdziemy bez problemu takie informacje.

     W przypadku, gdy chcemy zarejestrować kombinację klawiszy, musimy podać nazwy obu klawiszy, pamiętając o tym, że dla klawiszy rozszerzonych (Alt, Ctrl, Shift, Win) nie stosujemy początkowych liter w postaci VK, lecz MOD, a także musimy pamiętać o tym, że dla klawisza Ctrl stosujemy jego pełną nazwę, czyli Control.

     Po rejestracji klawiszy musimy jeszcze oprogramować procedury, które zostaną wykonane po ich naciśnięciu. Polecenia te zawieramy w procedurze WMHotKey. Cała ta procedura to zbiór osobnych warunków, które przypisane są do poszczególnych klawiszy zarejestrowanych wcześniej. Program sprawdza, czy któryś z klawiszy (opatrzony tu identyfikatorem „$” został naciśnięty:

       if Msg.wParam= $0001 then

          begin

              Opcja_niedostepna;

           end;

     Jeżeli przyjrzymy się bliżej kodowi metody Hot Key, stwierdzimy, że nie jest ona zbyt skomplikowana. Wydaje się ona być trudna z uwagi na jej rozbudowaną formę, wynikającą tylko i wyłącznie z tego, iż musimy zarejestrować i oprogramować każdy klawisz z osobna.

     Całą ideę metody Hot Key możemy zawrzeć w następujący schemat:

                      Form Create: RegisterHotKey(Handle,$0001,0,VK_F1)

                      WMHotKey: if Msg.wParam= $0001 then ...

    Najpierw rejestrujemy klawisz, a następnie przypisujemy do niego polecenie, które ma zostać wykonane. Taka budowa hooka pozwala nam na wybranie do przechwytu tylko takie klawisze i skróty, jakie chcemy. Nie musimy więc stosować pełnej wersji tej metody, którą tu zamieszczamy. Po wybraniu klawiszy, rejestrujemy je w dowolnej kolejności, pamiętając o tym, aby poszczególne identyfikatory ($0000) były ciągiem kolejnych liczb naturalnych: 0001, 0002, 0003 itd.


       Oto pełny kod metody Hot Key:
 
unit Unit1;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;



type

TForm1 = class(TForm)

procedure Opcja_niedostepna;

procedure FormCreate(Sender: TObject);



private

{ Private declarations }

procedure WMHotKey(var Msg: TMessage); message WM_HOTKEY;



public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.dfm}





// PROCEDURA OPCJA NIEDOSTĘPNA //

procedure TForm1.Opcja_niedostepna;

begin

ShowMessage('Opcja niedostępna');

end;



//rejestracja skrótów klawiaturowych

procedure TForm1.FormCreate(Sender: TObject);

begin


// SKRÓTY KLAWIATUROWE F1-F12 i Esc //



RegisterHotKey(Handle,$0001,0,VK_F1); // F1

RegisterHotKey(Handle,$0002,0,VK_F2); // F2

RegisterHotKey(Handle,$0003,0,VK_F3); // F3

RegisterHotKey(Handle,$0004,0,VK_F4); // F4

RegisterHotKey(Handle,$0005,0,VK_F5); // F5

RegisterHotKey(Handle,$0006,0,VK_F6); // F6

RegisterHotKey(Handle,$0007,0,VK_F7); // F7

RegisterHotKey(Handle,$0008,0,VK_F8); // F8

RegisterHotKey(Handle,$0009,0,VK_F9); // F9

RegisterHotKey(Handle,$0010,0,VK_F10); // F10

RegisterHotKey(Handle,$0011,0,VK_F11); // F11

RegisterHotKey(Handle,$0012,0,VK_F12); // F12

RegisterHotKey(Handle,$0013,0,VK_ESCAPE); // Esc



// SKRÓTY KLAWIATUROWE Alt+F1-F12,Esc



RegisterHotKey(Handle,$0014,MOD_ALT,VK_F1); //Alt+F1

RegisterHotKey(Handle,$0015,MOD_ALT,VK_F2); //Alt+F2

RegisterHotKey(Handle,$0016,MOD_ALT,VK_F3); //Alt+F3

RegisterHotKey(Handle,$0017,MOD_ALT,VK_F4); //Alt+F4

RegisterHotKey(Handle,$0018,MOD_ALT,VK_F5); //Alt+F5

RegisterHotKey(Handle,$0019,MOD_ALT,VK_F6); //Alt+F6

RegisterHotKey(Handle,$0020,MOD_ALT,VK_F7); //Alt+F7

RegisterHotKey(Handle,$0021,MOD_ALT,VK_F8); //Alt+F8

RegisterHotKey(Handle,$0022,MOD_ALT,VK_F9); //Alt+F9

RegisterHotKey(Handle,$0023,MOD_ALT,VK_F10); //Alt+F10

RegisterHotKey(Handle,$0024,MOD_ALT,VK_F11); //Alt+F11

RegisterHotKey(Handle,$0025,MOD_ALT,VK_F12); //Alt+F12

RegisterHotKey(Handle,$0026,MOD_ALT,VK_ESCAPE); //Alt+Esc



// SKRÓTY KLAWIATUROWE Ctrl+ F1-F12,Esc



RegisterHotKey(Handle,$0027,MOD_CONTROL,VK_F1); //Ctrl+F1

RegisterHotKey(Handle,$0028,MOD_CONTROL,VK_F2); //Ctrl+F2

RegisterHotKey(Handle,$0029,MOD_CONTROL,VK_F3); //Ctrl+F3

RegisterHotKey(Handle,$0030,MOD_CONTROL,VK_F4); //Ctrl+F4

RegisterHotKey(Handle,$0031,MOD_CONTROL,VK_F5); //Ctrl+F5

RegisterHotKey(Handle,$0032,MOD_CONTROL,VK_F6); //Ctrl+F6

RegisterHotKey(Handle,$0033,MOD_CONTROL,VK_F7); //Ctrl+F7

RegisterHotKey(Handle,$0034,MOD_CONTROL,VK_F8); //Ctrl+F8

RegisterHotKey(Handle,$0035,MOD_CONTROL,VK_F9); //Ctrl+F9

RegisterHotKey(Handle,$0036,MOD_CONTROL,VK_F10); //Ctrl+F10

RegisterHotKey(Handle,$0037,MOD_CONTROL,VK_F11); //Ctrl+F11

RegisterHotKey(Handle,$0038,MOD_CONTROL,VK_F12); //Ctrl+F12

RegisterHotKey(Handle,$0039,MOD_CONTROL,VK_ESCAPE); //Ctrl+Esc



// PRZECHWYT KLAWISZY STRZALEK //



RegisterHotKey(Handle,$0040,0,VK_LEFT); // strzałka w lewo

RegisterHotKey(Handle,$0041,0,VK_RIGHT); // strzałka w prawo

RegisterHotKey(Handle,$0042,0,VK_UP); // strzałka w górę

RegisterHotKey(Handle,$0043,0,VK_DOWN); // strzałka w dół



// PRZECHWYT INNYCH KLAWISZY I SKRÓTÓW KLAWIATUROWYCH //



RegisterHotKey(Handle,$0044,MOD_CONTROL,VK_TAB); //Ctrl+Tab

RegisterHotKey(Handle,$0045,MOD_ALT,VK_TAB); //Alt+Tab

RegisterHotKey(Handle,$0046,MOD_CONTROL,VK_CAPITAL); //Ctrl+CapsLock

RegisterHotKey(Handle,$0047,MOD_ALT,VK_CAPITAL); //Alt+CapsLock



RegisterHotKey(Handle,$0048,0,VK_TAB); //klawisz TAB

RegisterHotKey(Handle,$0049,0,VK_CAPITAL); //klawisz CAPS LOCK

RegisterHotKey(Handle,$0050,0,VK_INSERT); //klawisz INSERT

RegisterHotKey(Handle,$0051,0,VK_HOME); //klawisz Home

RegisterHotKey(Handle,$0052,0,VK_PRIOR); //klawisz PAGE UP

RegisterHotKey(Handle,$0053,0,VK_DELETE); //klawisz DELETE

RegisterHotKey(Handle,$0054,0,VK_END); //klawisz END

RegisterHotKey(Handle,$0055,0,VK_NEXT); //klawisz PAGE DOWN

RegisterHotKey(Handle,$0056,0,VK_SNAPSHOT); //klawisz PRINT SCRN

RegisterHotKey(Handle,$0057,0,VK_SCROLL); //klawisz SCROLL LOCK

RegisterHotKey(Handle,$0058,0,VK_PAUSE); //klawisz PAUSE BREAK

RegisterHotKey(Handle,$0059,0,VK_SPACE); //klawisz Spacja

RegisterHotKey(Handle,$0060,0,VK_NUMLOCK); //klawisz NumLock

RegisterHotKey(Handle,$0061,0,VK_ADD); //klawisz '+' klawiatura numeryczna

RegisterHotKey(Handle,$0062,0,VK_SUBTRACT); //klawisz '-' klawiatura numeryczna

RegisterHotKey(Handle,$0063,0,VK_MULTIPLY); //klawisz '*' klawiatura numeryczna

RegisterHotKey(Handle,$0064,0,VK_DIVIDE); //klawisz '/' klawiatura numeryczna


RegisterHotKey(Handle,$0065,MOD_ALT,VK_BACK); //Alt+Backpace

RegisterHotKey(Handle,$0066,MOD_ALT,VK_SPACE); //Alt+Spacja

RegisterHotKey(Handle,$0067,MOD_ALT,VK_RETURN); //Alt+Enter

RegisterHotKey(Handle,$0068,MOD_ALT,VK_SNAPSHOT); //Alt+PrintScrn

RegisterHotKey(Handle,$0069,MOD_ALT,VK_SCROLL); //Alt+ScrollLock

RegisterHotKey(Handle,$0070,MOD_ALT,VK_PAUSE); //Alt+Pause

RegisterHotKey(Handle,$0071,MOD_ALT,VK_INSERT); //Alt+Insert

RegisterHotKey(Handle,$0072,MOD_ALT,VK_HOME); //Alt+Home

RegisterHotKey(Handle,$0073,MOD_ALT,VK_PRIOR); //Alt+PageUp

RegisterHotKey(Handle,$0074,MOD_ALT,VK_DELETE); //Alt+Delete

RegisterHotKey(Handle,$0075,MOD_ALT,VK_END); //Alt+End

RegisterHotKey(Handle,$0076,MOD_ALT,VK_NEXT); //Alt+PageDown

RegisterHotKey(Handle,$0077,MOD_ALT,VK_LEFT); //Alt+Strzałka lewa

RegisterHotKey(Handle,$0078,MOD_ALT,VK_UP); //Alt+Strzałka górna

RegisterHotKey(Handle,$0079,MOD_ALT,VK_RIGHT); //Alt+Strzałka prawa

RegisterHotKey(Handle,$0080,MOD_ALT,VK_DOWN); //Alt+Strzałka dolna

RegisterHotKey(Handle,$0081,MOD_ALT,VK_NUMLOCK); //Alt+NumLock

RegisterHotKey(Handle,$0082,MOD_ALT,VK_ADD); //Alt+ '+' klawiatura

numeryczna

RegisterHotKey(Handle,$0083,MOD_ALT,VK_SUBTRACT); //Alt+ '-' klawiatura

numeryczna

RegisterHotKey(Handle,$0084,MOD_ALT,VK_MULTIPLY); //Alt+ '*' klawiatura

numeryczna

RegisterHotKey(Handle,$0085,MOD_ALT,VK_DIVIDE); //Alt+ '/' klawiatura 
numeryczna

RegisterHotKey(Handle,$0086,MOD_CONTROL,VK_BACK); //Ctrl+BackPace

RegisterHotKey(Handle,$0087,MOD_CONTROL,VK_SPACE); //Ctrl+Space

RegisterHotKey(Handle,$0088,MOD_CONTROL,VK_RETURN); //Ctrl+Enter

RegisterHotKey(Handle,$0089,MOD_CONTROL,VK_BACK); //Ctrl+BackPace

RegisterHotKey(Handle,$0090,MOD_CONTROL,VK_SNAPSHOT); //Ctrl+PrintScrn

RegisterHotKey(Handle,$0091,MOD_CONTROL,VK_INSERT); //Ctrl+Insert

RegisterHotKey(Handle,$0092,MOD_CONTROL,VK_HOME); //Ctrl+Home

RegisterHotKey(Handle,$0093,MOD_CONTROL,VK_PRIOR); //Ctrl+PageUp

RegisterHotKey(Handle,$0094,MOD_CONTROL,VK_DELETE); //Ctrl+Delete

RegisterHotKey(Handle,$0095,MOD_CONTROL,VK_END); //Ctrl+End

RegisterHotKey(Handle,$0096,MOD_CONTROL,VK_NEXT); //Ctrl+PageDown

RegisterHotKey(Handle,$0097,MOD_CONTROL,VK_LEFT); //Ctrl+Strzałka lewa

RegisterHotKey(Handle,$0098,MOD_CONTROL,VK_UP); //Ctrl+Strzałka górna

RegisterHotKey(Handle,$0099,MOD_CONTROL,VK_RIGHT); //Ctrl+Strzałka prawa

RegisterHotKey(Handle,$0100,MOD_CONTROL,VK_DOWN); //Ctrl+Strzałka dolna

RegisterHotKey(Handle,$0101,MOD_CONTROL,VK_ADD); //Ctrl+ '+' klawiatura

numeryczna

RegisterHotKey(Handle,$0102,MOD_CONTROL,VK_SUBTRACT); //Ctrl+'-'

klawiatura numeryczna

RegisterHotKey(Handle,$0103,MOD_CONTROL,VK_MULTIPLY); //Ctrl+'*'

klawiatura numeryczna

RegisterHotKey(Handle,$0104,MOD_CONTROL,VK_DIVIDE); //Ctrl+'/' klawiatura

numeryczna



// SKRÓTY KLAWIATUROWE Win+ klawisz



RegisterHotKey(Handle,$0105,MOD_WIN,VK_F2); //Win+F2

RegisterHotKey(Handle,$0106,MOD_WIN,VK_F3); //Win+F3

RegisterHotKey(Handle,$0107,MOD_WIN,VK_F4); //Win+F4

RegisterHotKey(Handle,$0108,MOD_WIN,VK_F5); //Win+F5

RegisterHotKey(Handle,$0109,MOD_WIN,VK_F6); //Win+F6

RegisterHotKey(Handle,$0110,MOD_WIN,VK_F7); //Win+F7

RegisterHotKey(Handle,$0111,MOD_WIN,VK_F8); //Win+F8

RegisterHotKey(Handle,$0112,MOD_WIN,VK_F9); //Win+F9

RegisterHotKey(Handle,$0113,MOD_WIN,VK_F10); //Win+F10

RegisterHotKey(Handle,$0114,MOD_WIN,VK_F11); //Win+F11

RegisterHotKey(Handle,$0115,MOD_WIN,VK_F12); //Win+F12

RegisterHotKey(Handle,$0116,MOD_WIN,VK_ESCAPE); //Win+Esc

RegisterHotKey(Handle,$0117,MOD_WIN,VK_BACK); //Win+Backpace

RegisterHotKey(Handle,$0118,MOD_WIN,VK_CAPITAL); //Win+CapsLock

RegisterHotKey(Handle,$0119,MOD_WIN,VK_SPACE); //Win+Spacja

RegisterHotKey(Handle,$0120,MOD_WIN,VK_RETURN); //Win+Enter

RegisterHotKey(Handle,$0121,MOD_WIN,VK_SNAPSHOT); //Win+PrintScrn

RegisterHotKey(Handle,$0122,MOD_WIN,VK_SCROLL); //Win+ScrollLock

RegisterHotKey(Handle,$0123,MOD_WIN,VK_INSERT); //Win+Insert

RegisterHotKey(Handle,$0124,MOD_WIN,VK_HOME); //Win+Home

RegisterHotKey(Handle,$0125,MOD_WIN,VK_PRIOR); //Win+PageUp

RegisterHotKey(Handle,$0126,MOD_WIN,VK_DELETE); //Win+Delete

RegisterHotKey(Handle,$0127,MOD_WIN,VK_END); //Win+End

RegisterHotKey(Handle,$0128,MOD_WIN,VK_NEXT); //Win+PageDown

RegisterHotKey(Handle,$0129,MOD_WIN,VK_LEFT); //Win+Strzałka lewa

RegisterHotKey(Handle,$0130,MOD_WIN,VK_UP); //Win+Strzałka górna

RegisterHotKey(Handle,$0131,MOD_WIN,VK_RIGHT); //Win+Strzałka prawa

RegisterHotKey(Handle,$0132,MOD_WIN,VK_DOWN); //Win+Strzałka dolna

RegisterHotKey(Handle,$0133,MOD_WIN,VK_NUMLOCK); //Win+NumLock

RegisterHotKey(Handle,$0134,MOD_WIN,VK_ADD); //Win+ '+' klawiatura

numeryczna

RegisterHotKey(Handle,$0135,MOD_WIN,VK_SUBTRACT); //Win+ '-' klawiatura

numeryczna

RegisterHotKey(Handle,$0136,MOD_WIN,VK_MULTIPLY); //Win+ '*' klawiatura

numeryczna

RegisterHotKey(Handle,$0137,MOD_WIN,VK_DIVIDE); //Win+ '/' klawiatura

numeryczna



// SKRÓTY KLAWIATUROWE Shift + klawisz



RegisterHotKey(Handle,$0138,MOD_SHIFT,VK_F1); //Shift+F1

RegisterHotKey(Handle,$0139,MOD_SHIFT,VK_F2); //Shift+F2

RegisterHotKey(Handle,$0140,MOD_SHIFT,VK_F3); //Shift+F3

RegisterHotKey(Handle,$0141,MOD_SHIFT,VK_F4); //Shift+F4

RegisterHotKey(Handle,$0142,MOD_SHIFT,VK_F5); //Shift+F5

RegisterHotKey(Handle,$0143,MOD_SHIFT,VK_F6); //Shift+F6

RegisterHotKey(Handle,$0144,MOD_SHIFT,VK_F7); //Shift+F7

RegisterHotKey(Handle,$0145,MOD_SHIFT,VK_F8); //Shift+F8

RegisterHotKey(Handle,$0146,MOD_SHIFT,VK_F9); //Shift+F9

RegisterHotKey(Handle,$0147,MOD_SHIFT,VK_F10); //Shift+F10

RegisterHotKey(Handle,$0148,MOD_SHIFT,VK_F11); //Shift+F11
RegisterHotKey(Handle,$0149,MOD_SHIFT,VK_BACK); //Shift+Backpace

RegisterHotKey(Handle,$0150,MOD_SHIFT,VK_TAB); //Shift+Tab

RegisterHotKey(Handle,$0151,MOD_SHIFT,VK_CAPITAL); //Shift+CapsLock

RegisterHotKey(Handle,$0152,MOD_SHIFT,VK_SPACE); //Shift+Spacja

RegisterHotKey(Handle,$0153,MOD_SHIFT,VK_RETURN); //Shift+Enter

RegisterHotKey(Handle,$0154,MOD_SHIFT,VK_SNAPSHOT); //Shift+PrintScrn

RegisterHotKey(Handle,$0155,MOD_SHIFT,VK_SCROLL); //Shift+ScrollLock

RegisterHotKey(Handle,$0156,MOD_SHIFT,VK_PAUSE); //Shift+Pause

RegisterHotKey(Handle,$0157,MOD_SHIFT,VK_INSERT); //Shift+Insert

RegisterHotKey(Handle,$0158,MOD_SHIFT,VK_HOME); //Shift+Home

RegisterHotKey(Handle,$0159,MOD_SHIFT,VK_PRIOR); //Shift+PageUp

RegisterHotKey(Handle,$0160,MOD_SHIFT,VK_DELETE); //Shift+Delete

RegisterHotKey(Handle,$0161,MOD_SHIFT,VK_END); //Shift+End

RegisterHotKey(Handle,$0162,MOD_SHIFT,VK_NEXT); //Shift+PageDown

RegisterHotKey(Handle,$0163,MOD_SHIFT,VK_LEFT); //Shift+Strzałka lewa

RegisterHotKey(Handle,$0164,MOD_SHIFT,VK_UP); //Shift+Strzałka górna

RegisterHotKey(Handle,$0165,MOD_SHIFT,VK_RIGHT); //Shift+Strzałka prawa

RegisterHotKey(Handle,$0166,MOD_SHIFT,VK_DOWN); //Shift+Strzałka dolna

RegisterHotKey(Handle,$0167,MOD_SHIFT,VK_NUMLOCK); //Shift+NumLock

RegisterHotKey(Handle,$0168,MOD_SHIFT,VK_ADD); //Shift+ '+' klawiatura

numeryczna

RegisterHotKey(Handle,$0169,MOD_SHIFT,VK_SUBTRACT); //Shift+ '-' klawiatura

numeryczna

RegisterHotKey(Handle,$0170,MOD_SHIFT,VK_MULTIPLY); //Shift+ '*' klawiatura

numeryczna

RegisterHotKey(Handle,$0171,MOD_SHIFT,VK_DIVIDE); //Shift+ '/' klawiatura

numeryczna

end;

 


 


//procedury wykonawcze do skrótów klawiaturowych



procedure TForm1.WMHotKey(var Msg: TMessage);

begin



if Msg.wParam=$0001 then //jezeli naciszniesz klawisz F1 to ...

begin //...

Opcja_niedostepna;

end;



if Msg.wParam=$0002 then //jezeli naciszniesz klawisz F2 to...

begin //...

Opcja_niedostepna;

end;


 (...)
 
if Msg.wParam=$0170 then //jezeli nacisniesz klawisz Shift+'*' klawiatura numeryczna,

wtedy...

begin //...

Opcja_niedostepna;

end;



if Msg.wParam=$0171 then //jezeli nacisniesz klawisz Shift+'/' klawiatura numeryczna,

wtedy...

begin //...

Opcja_niedostepna;

end;



end;

end.

                                < Wstecz    1...3/5    Dalej >

Artykuł pochodzi z mojej książki pt. "Delphi w przykładach dla początkujących". Zapraszam na Stronę książki.

poradnik programowania Delphi




Ciekawe artykuły:


    Zapoznaj się z innymi artykułami. Przejdź do zakładki Spis artykułów.


Brak komentarzy:

Prześlij komentarz