It depends a lot on the PBX in use - I've work with Avaya and CallMedia servers. Both of those companies provided a small desktop client and a DLL which can be referenced from within code.
The biggest problem is informing the web page once the system tray app gets an event. Launching a browser can be slow and is not a good user experience for call handling. Better is to keep a browser open and receive events..
The company I worked for used some pretty out-dated tech so they had:
PBX --(XML)-- PBX System Tray Client --(COM)-- Our own desktop app --(COM)-- An ActiveXControl embedded in the page --(Javascript)-- The website framework which handled the event as appropriate
As you can see it was quite long and convoluted - A more elegant approach would be to have a silverlight/similar app embedded on the page which receives events from the system tray client (via a web service or similar?)
You also need to address the question of a) multiple pages open - do all get the events? and b) swapping PBX at a later date shouldn't require a complete re-write.
As I left that company we were implementing a mechanism where our app received messages from the PBX directly via XML. Silverlight controls on any/all web pages registered with our desktop app via 2-Way WCF. We then had our desktop app send the appropriate events to the appropriate page.
Some other things to consider: Are you going to be handling mixed-channel? ie can handling an email block an incoming call event? If so, you need some sort of 2-way comms to say "Rejecting call...". You also need to be careful about what State the agents' telset is in - If you go to an "available" state before you finish saving data, you can potentially browse away before recording everything. Also, in my experience, agents are really happy to press the buttons on the telset rather than in your app - so you need to handle unexpected status changes.
Also consider transferring calls - most modern PBX allow a call transfer to occur in such a way that an id is associated with the call - so if it's an internal transfer, the recipients' screen can show all call notes/etc.
I can provide more info if you can clarify what PBX/etc. you're using and what events you need to handle
Events I'd recommend you handle at a minimum:
Call ringing,
Call answered,
Call Dropped,
Call Transferred
and you should be able to raise:
Accept Call,
Place Call,
Drop Call,
Transfer Call (Hot and Cold transfers, optionally with data if it's internal)
Of course this may be overkill for your solution :)
Edit: I forgot to add that our solution also handled logging the agents on/off of the telset when they logged into the web app - This gave a really nice user experience but required handling all the logon/logoff variables as well as maintaining a lookup table of user->extension #