Following example creates a tracking tooltip in a Windows Form -
Public Class Form1
Dim hTooltip As IntPtr
Dim hInst As IntPtr
Dim tool As Win32.TOOLINFO
Dim ret As IntPtr
Dim OldX As Integer = -1
Dim OldY As Integer = -1
Dim IsActivated As Boolean = False
Private Function MakeLParam(ByVal LoWord As Integer, ByVal HiWord As Integer) As IntPtr
Return ((HiWord << 16) Or (LoWord And &HFFFF)) 'New IntPtr
End Function
Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
ret = Win32.SendMessage(hTooltip, Win32.TTM_TRACKACTIVATE, 0, tool)
OldX = -1
OldY = -1
IsActivated = False
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
hInst = Win32.GetModuleHandle(IntPtr.Zero)
hTooltip = Win32.CreateWindowEx(Win32.WindowStylesEx.WS_EX_TOOLWINDOW Or Win32.WindowStylesEx.WS_EX_TOPMOST,
Win32.TOOLTIPS_CLASS, String.Empty,
Win32.WindowStyles.WS_POPUP Or Win32.TTS_ALWAYSTIP Or Win32.TTS_BALLOON Or Win32.TTS_NOPREFIX,
0, 0, 0, 0, Handle, IntPtr.Zero, hInst, IntPtr.Zero)
If hTooltip <> IntPtr.Zero Then
tool.cbSize = Marshal.SizeOf(Of Win32.TOOLINFO)
tool.hinst = hInst
tool.hwnd = Handle
tool.uFlags = Win32.TTF_IDISHWND Or Win32.TTF_TRACK Or Win32.TTF_ABSOLUTE
tool.uId = Handle
tool.lpszText = String.Empty
tool.lParam = IntPtr.Zero
ret = Win32.SendMessage(hTooltip, Win32.TTM_ADDTOOLW, 0, tool)
ret = Win32.SendMessage(hTooltip, Win32.TTM_SETTITLEW, Win32.TTI_INFO, "Title for Tooltip")
End If
End Sub
Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
If (OldX <> e.X Or OldY <> e.Y) Then
OldX = e.X
OldY = e.Y
Dim strCoord As String = e.X.ToString() + ", " + e.Y.ToString()
tool.lpszText = strCoord
ret = Win32.SendMessage(hTooltip, Win32.TTM_UPDATETIPTEXTW, 0, tool)
Dim pt As Point = PointToScreen(e.Location)
Dim lp As IntPtr = MakeLParam(pt.X, pt.Y)
ret = Win32.SendMessage(hTooltip, Win32.TTM_TRACKPOSITION, 0, lp)
If Not IsActivated Then
ret = Win32.SendMessage(hTooltip, Win32.TTM_TRACKACTIVATE, 1, tool)
IsActivated = True
End If
End If
End Sub
End Class
Public Class Win32
<StructLayout(LayoutKind.Sequential)>
Public Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure
Public Const TOOLTIPS_CLASS As String = "tooltips_class32"
Public Const WM_CREATE As Integer = &H1
Public Const WM_USER As Integer = &H400
Public Const TME_LEAVE As Integer = &H2
Public Const TTS_ALWAYSTIP As Integer = &H1
Public Const TTS_NOPREFIX As Integer = &H2
Public Const TTS_NOANIMATE As Integer = &H10
Public Const TTS_NOFADE As Integer = &H20
Public Const TTS_BALLOON As Integer = &H40
Public Const TTS_CLOSE As Integer = &H80
Public Const TTS_USEVISUALSTYLE As Integer = &H100 ' Use themed hyperlinks
Public Const TTF_IDISHWND As Integer = &H1
'// Use this to center around trackpoint in trackmode
'// -Or- to center around tool in normal mode.
'// Use TTF_ABSOLUTE to place the tip exactly at the track coords when
'// in tracking mode. TTF_ABSOLUTE can be used in conjunction with TTF_CENTERTIP
'// to center the tip absolutely about the track point.
Public Const TTF_CENTERTIP As Integer = &H2
Public Const TTF_RTLREADING As Integer = &H4
Public Const TTF_SUBCLASS As Integer = &H10
Public Const TTF_TRACK As Integer = &H20
Public Const TTF_ABSOLUTE As Integer = &H80
Public Const TTF_TRANSPARENT As Integer = &H100
Public Const TTF_PARSELINKS As Integer = &H1000
Public Const TTF_DI_SETITEM As Integer = &H8000 ' valid only On the TTN_NEEDTEXT callback
' ToolTip Icons (Set with TTM_SETTITLE)
Public Const TTI_NONE As Integer = 0
Public Const TTI_INFO As Integer = 1
Public Const TTI_WARNING As Integer = 2
Public Const TTI_ERROR As Integer = 3
Public Const TTI_INFO_LARGE As Integer = 4
Public Const TTI_WARNING_LARGE As Integer = 5
Public Const TTI_ERROR_LARGE As Integer = 6
Public Const TTM_ACTIVATE As Integer = WM_USER + 1
Public Const TTM_SETDELAYTIME As Integer = WM_USER + 3
Public Const TTM_ADDTOOLA As Integer = WM_USER + 4
Public Const TTM_ADDTOOLW As Integer = WM_USER + 50
Public Const TTM_DELTOOLA As Integer = WM_USER + 5
Public Const TTM_DELTOOLW As Integer = WM_USER + 51
Public Const TTM_NEWTOOLRECTA As Integer = WM_USER + 6
Public Const TTM_NEWTOOLRECTW As Integer = WM_USER + 52
Public Const TTM_RELAYEVENT As Integer = WM_USER + 7 ' Win7 : wParam = GetMessageExtraInfo() When relaying WM_MOUSEMOVE
Public Const TTM_GETTOOLINFOA As Integer = WM_USER + 8
Public Const TTM_GETTOOLINFOW As Integer = WM_USER + 53
Public Const TTM_SETTOOLINFOA As Integer = WM_USER + 9
Public Const TTM_SETTOOLINFOW As Integer = WM_USER + 54
Public Const TTM_HITTESTA As Integer = WM_USER + 10
Public Const TTM_HITTESTW As Integer = WM_USER + 55
Public Const TTM_GETTEXTA As Integer = WM_USER + 11
Public Const TTM_GETTEXTW As Integer = WM_USER + 56
Public Const TTM_UPDATETIPTEXTA As Integer = WM_USER + 12
Public Const TTM_UPDATETIPTEXTW As Integer = WM_USER + 57
Public Const TTM_GETTOOLCOUNT As Integer = WM_USER + 13
Public Const TTM_ENUMTOOLSA As Integer = WM_USER + 14
Public Const TTM_ENUMTOOLSW As Integer = WM_USER + 58
Public Const TTM_GETCURRENTTOOLA As Integer = WM_USER + 15
Public Const TTM_GETCURRENTTOOLW As Integer = WM_USER + 59
Public Const TTM_WINDOWFROMPOINT As Integer = WM_USER + 16
Public Const TTM_TRACKACTIVATE As Integer = WM_USER + 17 ' wParam = True / False start End lparam = LPTOOLINFO
Public Const TTM_TRACKPOSITION As Integer = WM_USER + 18 ' lParam = dwPos
Public Const TTM_SETTIPBKCOLOR As Integer = WM_USER + 19
Public Const TTM_SETTIPTEXTCOLOR As Integer = WM_USER + 20
Public Const TTM_GETDELAYTIME As Integer = WM_USER + 21
Public Const TTM_GETTIPBKCOLOR As Integer = WM_USER + 22
Public Const TTM_GETTIPTEXTCOLOR As Integer = WM_USER + 23
Public Const TTM_SETMAXTIPWIDTH As Integer = WM_USER + 24
Public Const TTM_GETMAXTIPWIDTH As Integer = WM_USER + 25
Public Const TTM_SETMARGIN As Integer = WM_USER + 26 ' lParam = lprc
Public Const TTM_GETMARGIN As Integer = WM_USER + 27 ' lParam = lprc
Public Const TTM_POP As Integer = WM_USER + 28
Public Const TTM_UPDATE As Integer = WM_USER + 29
Public Const TTM_GETBUBBLESIZE As Integer = WM_USER + 30
Public Const TTM_ADJUSTRECT As Integer = WM_USER + 31
Public Const TTM_SETTITLEA As Integer = WM_USER + 32 ' wParam = TTI_ *, lParam = Char * szTitle
Public Const TTM_SETTITLEW As Integer = WM_USER + 33 ' wParam = TTI_ *, lParam = wchar * szTitle
Public Const TTM_POPUP As Integer = WM_USER + 34
Public Const TTM_GETTITLE As Integer = WM_USER + 35 ' wParam = 0, lParam = TTGETTITLE *
<StructLayout(LayoutKind.Sequential)>
Public Structure TOOLINFO
Public cbSize As Integer
Public uFlags As Integer
Public hwnd As IntPtr
Public uId As IntPtr
Public rect As RECT
Public hinst As IntPtr
<MarshalAs(UnmanagedType.LPWStr)>
Public lpszText As String
Public lParam As IntPtr
Public lpReserved As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential)>
Public Structure _TRACKMOUSEEVENT
Public cbSize As Integer
Public dwFlags As Integer
Public dwHoverTime As Integer
Public hwndTrack As IntPtr
End Structure
Public Enum WindowStyles As UInteger
WS_BORDER = &H800000
WS_CAPTION = &HC00000
WS_CHILD = &H40000000
WS_CLIPCHILDREN = &H2000000
WS_CLIPSIBLINGS = &H4000000
WS_DISABLED = &H8000000
WS_DLGFRAME = &H400000
WS_GROUP = &H20000
WS_HSCROLL = &H100000
WS_MAXIMIZE = &H1000000
WS_MAXIMIZEBOX = &H10000
WS_MINIMIZE = &H20000000
WS_MINIMIZEBOX = &H20000
WS_OVERLAPPED = &H0
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_SIZEFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
WS_POPUP = &H80000000UI
WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU
WS_SIZEFRAME = &H40000
WS_SYSMENU = &H80000
WS_TABSTOP = &H10000
WS_VISIBLE = &H10000000
WS_VSCROLL = &H200000
End Enum
Public Enum WindowStylesEx As UInteger
WS_EX_ACCEPTFILES = &H10
WS_EX_APPWINDOW = &H40000
WS_EX_CLIENTEDGE = &H200
WS_EX_COMPOSITED = &H2000000
WS_EX_CONTEXTHELP = &H400
WS_EX_CONTROLPARENT = &H10000
WS_EX_DLGMODALFRAME = &H1
WS_EX_LAYERED = &H80000
WS_EX_LAYOUTRTL = &H400000
WS_EX_LEFT = &H0
WS_EX_LEFTSCROLLBAR = &H4000
WS_EX_LTRREADING = &H0
WS_EX_MDICHILD = &H40
WS_EX_NOACTIVATE = &H8000000
WS_EX_NOINHERITLAYOUT = &H100000
WS_EX_NOPARENTNOTIFY = &H4
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE
WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST
WS_EX_RIGHT = &H1000
WS_EX_RIGHTSCROLLBAR = &H0
WS_EX_RTLREADING = &H2000
WS_EX_STATICEDGE = &H20000
WS_EX_TOOLWINDOW = &H80
WS_EX_TOPMOST = &H8
WS_EX_TRANSPARENT = &H20
WS_EX_WINDOWEDGE = &H100
End Enum
<DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
Public Shared Function CreateWindowEx(
ByVal dwExStyle As WindowStylesEx,
ByVal lpClassName As String,
ByVal lpWindowName As String,
ByVal dwStyle As WindowStyles,
ByVal x As Integer,
ByVal y As Integer,
ByVal nWidth As Integer,
ByVal nHeight As Integer,
ByVal hWndParent As IntPtr,
ByVal hMenu As IntPtr,
ByVal hInstance As IntPtr,
ByVal lpParam As IntPtr) As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Unicode)>
Public Shared Function SendMessage(ByVal hWnd As IntPtr,
ByVal Msg As Integer,
ByVal wParam As Integer,
ByRef lParam As Win32.TOOLINFO) As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Unicode)>
Public Shared Function SendMessage(ByVal hWnd As IntPtr,
ByVal Msg As Integer,
ByVal wParam As Integer,
ByVal lParam As String) As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Unicode)>
Public Shared Function SendMessage(ByVal hWnd As IntPtr,
ByVal Msg As Integer,
ByVal wParam As Integer,
ByVal lParam As IntPtr) As IntPtr
End Function
<DllImport("kernel32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>
Public Shared Function GetModuleHandle(ByVal lpModuleName As IntPtr) As IntPtr
End Function
End Class