Many, if not most, Windows Forms samples you can find on the 'net include one or more calls to unmanaged code in Windows DLLs, often in the form of calls to the SendMessage API methods to fix some of the (very few) missing features of .NET controls. The problem is, such a call to unmanaged code creates a problem when the program runs as a ClickOnce application, because it requires higher CAS privileges.
Even though this problem doesn't have a generic solution, when you just need to send a message to the control you are inheriting from, you can avoid an explicit call to SendMessage by invoking the protected DefWndProc method instead. For example, let's say that you are writing an enhanced ComboBox that exposes the TopIndex property, which can set or return the index of the first visible item in the list area. These two operations can be implemented by sending the control the CB_SETTOPINDEX or CB_GETTOPINDEX message, respectively. Here's how you can use the DefWndProc method instead of SendMessage:
Public
Class ComboBoxEx
Inherits System.Windows.Forms.ComboBox
Public Property TopIndex() As Integer
Get
Const CB_GETTOPINDEX As Int32 = &H15B
Dim m As New Message()
m.HWnd = Me.Handle
m.Msg = CB_GETTOPINDEX
Me.DefWndProc(m)
Return m.Result.ToInt32()
End Get
Set(ByVal value As Integer)
Const CB_SETTOPINDEX As Int32 = &H15C
Dim m As New Message()
m.HWnd = Me.Handle
m.Msg = CB_SETTOPINDEX
m.WParam = New IntPtr(value)
Me.DefWndProc(m)
End Set
End Property
End Class
By the way, such an enhanced ComboBox can be useful when migrating a VB6 app to VB.NET. In fact, the VB6 ComboBox and ListBox controls expopse the TopIndex property, whereas under .NET only the ListBox control exposes this property. If you have any VB6 code that takes advantage of the ComboBox's TopIndex, the simplest approach is replacing the standard ComboBox with a ComboBoxEx instance.