Med PM (p† Windows ocks†), kommunicerar f”nster med meddelanden. Systemet skickar meddelanden till f”nstren automatiskt f”r alla typer av h„ndelser, och f”nster kan skicka meddelanden ocks† till varandra. Det finns hundratals olika systemmeddelanden, och applikationer kan definiera sina egna meddelanden ocks†.
Till exempel, om du klickar p† n†got f”nster med v„nster musknapp, kommer det f”nstret
att skickas WM_BUTTON1CLICK meddelandet fr†n systemet. Vad som h„nder sedan
beror p† typen (i PM: klassen) av f”nster. Till exempel, en containerkontroll kommer att
se om det finns n†got containerinneh†ll under muspekaren, och om s† „r fallet, v„lja korresponderande
inneh†ll. Ett Netscape klientf”nster kommer att se efter om det finns n†gon l„nk under muspekaren,
och om det „r fallet, ladda en ny HTML sida f”r att f”lja l„nken.
Det finns m†nga fler "viktiga" systemmeddelanden, s†dana som WM_CHAR
(f”r tangenttryckningar), WM_SIZE (n„r f”nster „r storleksf”r„ndrade),
WM_PAINT (n„r f”nster beh”ver ritas om), och
WM_DESTROY (n„r f”nster f”rst”rs). Det „r grundl„ggande varf”r PM
programmering verkar s† komplicerad f”rsta g†ngen, d„rf”r att PM programmering f”r det
mesta betyder att reagera p† meddelanden, vilket „r r„tt annorlunda mot "regulj„r" programmering,
d„r program normalt processar uppgifter sekvensiellt. Med PM, om inget meddelande finns
k”at f”r ett f”nster, g”r ett program normalt ingenting. Dess tr†dar blockeras till
meddelandena kommer in.
Nu, n„r en global meddelande hook funktion „r registrerad med systemet, passerar alla meddelanden genom hook funktionen f”re m†lf”nstret erh†ller meddelandet. P† det s„ttet kan en hook funktion modifiera meddelandet, omdirigera det till ett annat f”nster, g”ra n†got helt annorlunda sj„lvt, eller till och med sv„lja meddelandet s† att m†lf”nstret inte kommer att erh†lla det.
Det h„r „r hur alla v„lk„nda PM hook utilities (som NPS WPS, FeelX, ProgramCommander/2, X-it, Styler/2, och „ven &xwp; PM hook) fungerar. De f†ngar upp vissa meddelanden och manipulerar dom.
Till exempel, varje g†ng &xwp; PM hook tr„ffar p† ett WM_CHAR meddelande
(det betyder, n„r en tangent p† tangentbordet „r tryckt eller sl„ppt), kommer den att kontrollera
i den globala listan ”ver snabbkommandon. Om det „r s†, kommer meddelandet att sv„ljas (s† att
m†lf”nstret inte kommer att erh†lla det) och vissa delar av &xwp; WPS kod kommer att underr„ttas ist„llet,
vilken sedan kan ”ppna det korresponderande objektet vilket har definierats av anv„ndaren f”r att anv„nda
det snabbkommandot.
S„ttet p† vilket &xwp; hook „r implementerad skiljer sig lite fr†n vad som „r typiskt f”r hook utilities. De flesta av dessa utilities registrerar sina hook funktioner med PM n„r dom startas och avregistrerar hook igen n„r programmet avslutas (till exempel, om "st„ng" „r valt p† f”nsterlistan).
Ist„llet, registreras &xwp;'s PM hook fr†n ett specialprogram vilket inte „r synligt
i f”nsterlistan -- &xwp; daemon, XWPDAEMN.EXE. Du kan dock se det med WatchCat eller n†gon
annan processlistare. F”rs”k att d”da programmet: Du kommer att m„rka att all hook funktionalitet „r borta.
XWPDAEMN.EXE startas av &xwp; medan WPS startas upp den f”rsta g†ngen och k”rs till
systemet st„ngs av. Det betyder, att daemon k”rs „ven mellan omstarterna av Skrivbordet.
Žven om daemon „r ett PM program, skapar det inga f”nster (undantaget &pgr; f”nstret, se nedanf”r).
Allt detta „r t„mligen komplext i detalj d„rf”r att det involverar anv„ndning av delat minne och korrekt serialiseringsteknik som delade mutex semaforer och delad process av meddelanden, speciellt eftersom hook „r konfigurerad fr†n WPS inst„llningssidor, vilka k”rs i WPS processen. Men jag hoppas att du har f”rst†tt den grundl„ggade id‚n.
Det finns ett antal goda sk„l till att jag valt det h„r uppl„gget:
PMSHELL.EXE processen,
i vilken alla WPS klasser k”rs. Om WPS kraschar, „r det sv†rare att st„da upp installerade hooks
d„rf”r att WPS „r s† komplext p† egen hand.
F”r detaljer om &pgr;, se "Hur det fungerar" i &pgr; sektionen.