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. |