Λοιπον κατόπιν νεώτερης μελέτης κλείνω αυτό το thread ως επιλυμένο, παρ'όλο που δεν ακολούθησα τις συμβουλές σας. Η βοήθειά σας πάντως ήταν πολύτιμη μια και μου έδειξε κάποιες κατευθύνσεις.
Το πρόβλημα, σε ένα extent, λύνεται με την λογική της ενσωμάτωσης ενός webbrowser control σε μια φόρμα και τη δημιουργία ενός αυτόνομου executable με βάση αυτή τη φόρμα. Η calling application θα καλέσει αυτό ως process με credentials που θα "παίζουν", και έτσι λύνεται το θέμα του security (στο επίπεδο που ζητείται στο παρόν έργο).
Το ενδιαφέρον εδώ ήταν πως θα μπορούσα να "μπλοκάρω" οτιδήποτε ερχόταν στο webbrowser control (ctrl-n, ctrl-p, διάφορα άλλα πράγματα όπως το δεξί κλικ). Εκεί είχα δύο επιλογές: Να παίξω με τα events του browser control (δυσκολα, ασχημα, και πράγματα όπως το onContextMenu δεν δουλεύουν καλά σε framed σελίδες), ή να παίξω με τα events της φόρμας. Επέλεξα το δεύτερο.
Βρισκοντας κάποιο κώδικα και αλλάζοντάς τον αρκετά ωστε να κάνει αυτό που ήθελα, κατάφερα να έχω drag/drop, pageup/down και να μπλοκάρω όλα τα άλλα πράγματα ακολουθώντας μια restrictive πολιτική. Για να το κάνω έπρεπε η φόρμα μου να κάνει implement το IMessageFilter interface και να υλοποιήσει τη μέθοδο PreFilterMessage. Η μέθοδος αυτή "φιλτράρει" όλα τα μηνύματα που έρχονται στο παραθύρι πριν τα κάνει dispatch εκεί που πρέπει να πάνε. Αρα λοιπον μπορεί κανείς με αυτό τον τρόπο να "κόψει" μηνύματα όπως το δεξί κλικ για να μην φτασουν παρακάτω.
Η μέθοδος είναι boolean και οταν επιστρέφει FALSE δηλώνει οτι το μήνυμα θα τύχει περαιτέρω χειρισμού. Αν επιστρέψει TRUE, τότε το μήνυμα μπλοκάρεται εντός αυτού του σημείου. Παραθέτω τον κώδικα που χρησιμοποίησα, ο οποίος φιλτράρει για συγκεκριμένους τύπους events και μετά χρησιμοποιεί restriction, αφήνοντας να περάσουν μόνο τα επιθυμητά.
Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _
As Boolean Implements IMessageFilter.PreFilterMessage
'We watch for the following events:
' x100 (WM_KEYDOWN)
' x101 (WM_KEYUP)
' x104 (WM_SYSKEYDOWN)
' x200 (WM_MOUSEMOVE)
' x204 (WM_RBUTTONDOWN)
' x205 (WM_RBUTTONUP)
' x206 (WM_RBUTTONDBLCLK)
' x207 (WM_MBUTTONDOWN)
' x208 (WM_MBUTTONUP)
' x209 (WM_MBUTTONDBLCLK)
'We don't watch for WM_LBUTTON events (201-203) since these must pass as is.
'So we handle everything transparently except from those things refered above:
If Not ( _
m.Msg = &H100 _
Or m.Msg = &H101 _
Or m.Msg = &H104 _
Or m.Msg = &H204 _
Or m.Msg = &H205 _
Or m.Msg = &H206 _
Or m.Msg = &H207 _
Or m.Msg = &H208 _
Or m.Msg = &H209 _
) Then
'Let the event be passed further on
Return False
End If
'Find the key code
Dim keyCode As Keys = CType(m.WParam.ToInt32(), Keys) And Keys.KeyCode
'Here we follow a restrictive approach, letting only the keystrokes
'that interest us pass. Everything else is stopped.
Select Case keyCode
Case Keys.Down
Return False
Case Keys.Up
Return False
Case Keys.PageDown, Keys.PageUp
Return False
Case Else
'Block everything else!
Return True
End Select
End Function
Φυσικά, ίσως δεν είναι η καλύτερη υλοποίηση, αν υπάρχουν σχόλια πολύ ευχαρίστως να τα ακούσω.
Ξερω οτι φύγαμε εκτος του αρχικού θέματος, αλλά τελικά έτσι λύθηκε το θέμα :)
Σωτήρης Φιλιππίδης
DotSee Web Services