Založte si
nový projekt a přidejte do něj i nový modul, takže byste v Project Exploreru
měli mít Form1 a Module1. Otevřete modul a zapište následující deklaraci:
Public
Const GWL_WNDPROC = (-4)
Public Declare Function SetWindowLong Lib "user32"_
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As
Long
Tato API funkce Vám umožňuje přesměrovat zprávy, které se vztahují k
Vašemu formuláři do modulu, a to ještě před tím, než jsou formulářem
zpracovány. Parametry API funkce mohou vypadat trochu děsivě, ale nejsou
zase tak nepochopitelné:
hwnd
Argument typu Long Integer, který specifikuje unikátní ID pro okno nebo
formulář. V podstatě se jedná o ukazatel, který umožňuje API funkci
manipulovat s objektem, aniž by se do ní musel zasílat celý objekt jako
argument.
nIndex
Identifikuje typ operace, která se má provést. Protože v našem případě
budeme modifikovat proces, tak budeme používat konstantu GWL_WNDPROC
dwNewLong
Specifikuje adresu nové funkce nebo procedury, kterou použijeme pro
zpracování zprávy zasílané z Windows (v našem případě GWL_WNDPROC)
Funkce,
která bude zpracovávat zprávy, musí být poměrně přesně definována, tak aby
akceptoval všechny argumenty, které Windows zasílají ve svých zprávách. Musí
být také schopna přeposílat zprávy, které nebudeme modifikovat. Do modulu
přidejte ještě následující deklarace:
Public
oldWindowProc as Long
Private Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" ( ByVal
lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As
Long
A do modulu také přidejte následující routinu:
Public
Function NewWindowProc(ByVal hWnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Debug.Print "&H" & Hex(uMsg), wParam, lParam
NewWindowProc = CallWindowProc(oldWindowProc, hWnd, _
uMsg, wParam, lParam)
End function
Tato funkce nedělá nic jiného, než že vypisuje zprávy do Debug okna, tak jak
přichází z Windows. Funkce se momentálně zprávy jen předává zpět do
původního procesu z Windows. Argumenty, zasílané do "NewWindowProc" jsou
ukazatel na okno, které mělo původně zprávu obdržet (hWnd), vlastní zpráva (uMsg)
a dva argumenty s parametry (wParam a lParam). Později se na tyto argumenty
podíváme detailně.
Pokud byste
projekt nyní spustili, tak neuvidíte nic. Respektive uvidíte formulář, ale
nic se nebude dít, protože ještě není spuštěn subclassing a žádná ze zpráv,
zasílaných z Windows se v okně Debug neobjeví.
Myslím, že
z toho, co je tu uvedeno už je jasné, o co v subclassingu jde - chytíme si
zprávu, přesměrujeme řízení jejího procesu někam jinam, tam si to zpracujeme
a upravíme a pošleme dál, ovšem již změněné.
Před tím,
než spustíme subclassing okna a začneme "poodhrnovat záclonu tajemství", tak
znovu musím upozornit na to, abyste nepoužívali tlačítko STOP!!! A
vždy se před spuštěním ujistěte, že jste si projekt uložili. |