Hallo Rainer,
Threads musst du nicht direkt beenden. Sie beenden sich von selbst!
Das Problem liegt darin das wenn etwas in dem Thread noch ausgefuehrt wird, dann VB abschmiert 
Du kannst Thread voruebergehend anhalten ( Auf Eis legen) Aber auch wenn du dann VB beendest, schmiert es dir ab. Ergo du musst vorher zwingend den Thread beenden!
Um mal wieder auf das ursprüngliche Posting zu kommen.
Er soll in dem Thread die Sendmessage API senden!
Solange bleibt er ja im Thread stehen. Irgendwann kommt er dann ja wieder zurueck ( Sendmessage hat abgearbeitet) So setzt er nun ein Flag das VB beendet werden kann.
Bsp:
'Im Modul
Public InProgress as Boolean
Private Function RunThread(p as long) as long
InProgress=True
'Hier seine Sendmessage nachricht schicken
InProgress=False
' In der Form
Private Sub Beenden\_Click()
If InProgress then
Msgbox " Program kann noch nicht beendet werden, da noch aktivitäten ausgeführt werden",vbcritical
else
unload me
end if
End Sub
Aber zur Veranschaulichung poste ich dir mal ein kleines Demo, was die wirkungsweise veranschaulicht.
Erstelle ein Modul, Eine Form (Form1).
Auf die Form packe folgende Steuerelemente
Eine Checkbox -> Caption Suspend / Auf Eis legen / Thread anhalten
3 Command Button
Button 1 -> Start Thread
Button 2 -> Stop Thread
Button 3 -> Mach irgendwas
Dazu noch 2 Pictureboxen
Picture 1 -> Aktionen werden vom Thread angezeigt
Picture 2 -> Vb malt drinnen rum 
Sodele dann kopiere mal folgenden Code ins Project
'Im Modul
Option Explicit
Declare Function CreateThread Lib "kernel32" (ByVal lpSecurityAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Public Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Public Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Public Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Public ThreadIsRunning As Boolean
Public ThreadBeenden As Boolean
Public WatchTHID As Long
Public hWatchTH As Long
Public Const CREATE\_SUSPEND = &H4
Public Const THREAD\_PRIORITY\_IDLE = -15
Public Const THREAD\_PRIORITY\_TIME\_CRITICAL = 15
Public Const THREAD\_PRIORITY\_NORMAL = 0
Public Function ThreadExecute(p As Long) As Long
While Not ThreadBeenden
Form1.Picture1.ForeColor = QBColor(Int(14 \* Rnd))
Ellipse Form1.Picture1.hdc, Rnd \* 150, Rnd \* 150, Rnd \* 150, Rnd \* 150
Wend
Form1.Command1.Enabled = True
Form1.Command2.Enabled = False
Form1.Command3.Enabled = True
Form1.Check1.Enabled = False
ThreadExecute = 1
End Function
Public Function RunThread() As Boolean
Form1.Command1.Enabled = False
Form1.Command2.Enabled = True
Form1.Check1.Enabled = True
hWatchTH = CreateThread(ByVal 0&, 0, AddressOf ThreadExecute, ByVal 0&, CREATE\_SUSPEND, WatchTHID)
SetThreadPriority hWatchTH, THREAD\_PRIORITY\_NORMAL
ThreadBeenden = False
ResumeThread hWatchTH
RunThread = True
End Function
' In der Form1
Option Explicit
Private Sub Check1\_Click()
If Check1.Value = 0 Then
ResumeThread hWatchTH
Else
SuspendThread hWatchTH
End If
End Sub
Private Sub Command1\_Click()
Call RunThread
End Sub
Private Sub Command2\_Click()
ThreadBeenden = True
End Sub
Private Sub Command3\_Click()
Dim i&
For i = 1 To 10000
Picture2.ForeColor = QBColor(Int(14 \* Rnd))
Ellipse Picture2.hdc, Rnd \* 150, Rnd \* 150, Rnd \* 150, Rnd \* 150
Next i
End Sub
Private Sub Command4\_Click()
Unload Me
End Sub
So nun starte mal das prog und klicke ein wenig rum.
Speichere das Projecjt aber vorher!
1:Thread starten -> Exit klicken
2:Thread starten -> Stopp klicken
3:Thread starten -> Checkbox klicken
4:Thread starten -> Checkbox klicken -> Exit klicken
5:Thread starten -> Checkbox klicken -> Checkboxen klicken
6:Thread starten -> Stopp klicken -> Exit klicken
1: Thread wird gestartet und VB schmiert ab
2: Thread wird gestartet, danach gestoppt
3: Thread wird gestartet und danach angehalten
4: Thread wird gestartet, danach angehalten, danach schmiert vb ab
5: Thread wird gestartet, danach angehalten, danach fortgesetzt
6: Thread wird gestartet, Thread wird gestoppt, VB wird beendet. VB schmiert NICHT ab!
Ich hoffe ich konnte es dir jetzt ein wenig naeher bringen 
Achso. TerminateThread sollte man tünlichst vermeiden, alldiweil alle Resourcen die der Thread belegt hat, werden dann nicht wieder freigegeben. Das macht man nur wenn sich ein Thread aufgehangen hat und selbst dann musst du den Speicher manuell wieder aufraeumen 
MfG Alex