diff --git a/controls/scroll.c b/controls/scroll.c
index e1f9740..c11825e 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -816,6 +816,18 @@
         (SCROLL_TrackingBar == nBar))
         SCROLL_DrawMovingThumb( hdc, &rect, vertical, arrowSize, thumbSize );
 
+    if(hwnd==GetFocus())  /* if scroll bar has focus, reposition the caret*/
+    {
+        if (!vertical)
+        {
+            SetCaretPos(thumbPos+1, rect.top+1);
+        }
+        else
+        {
+            SetCaretPos(rect.top+1, thumbPos+1);
+        }
+    }
+
 END:
     WIN_ReleaseWndPtr(wndPtr);
 }
@@ -907,14 +919,15 @@
     switch(msg)
     {
       case WM_LBUTTONDOWN:  /* Initialise mouse tracking */
-	  SCROLL_trackVertical = vertical;
+          HideCaret(hwnd);  /* hide caret while holding down LBUTTON*/
+          SCROLL_trackVertical = vertical;
           SCROLL_trackHitTest  = hittest = SCROLL_HitTest( hwnd, nBar, pt, FALSE );
           lastClickPos  = vertical ? (pt.y - rect.top) : (pt.x - rect.left);
           lastMousePos  = lastClickPos;
           trackThumbPos = thumbPos;
           prevPt = pt;
           SetCapture( hwnd );
-          if (nBar == SB_CTL) SetFocus( hwnd );
+          if (nBar == SB_CTL && (GetWindowLongA(hwnd, GWL_STYLE) & WS_TABSTOP)) SetFocus( hwnd );
           break;
 
       case WM_MOUSEMOVE:
@@ -925,6 +938,8 @@
       case WM_LBUTTONUP:
           hittest = SCROLL_NOWHERE;
           ReleaseCapture();
+          /* if scrollbar has focus, show back caret */
+          if (hwnd==GetFocus()) ShowCaret(hwnd);
           break;
 
       case WM_SYSTIMER:
@@ -1142,10 +1157,60 @@
         }
         break;
 
+    /* if key event is received, the scrollbar has the focus*/
     case WM_KEYDOWN:
+        HideCaret(hwnd);  /*hide caret to prevent flicker*/
         SCROLL_HandleKbdEvent( hwnd, wParam );
         break;
 
+    case WM_KEYUP:
+        ShowCaret(hwnd);
+        break;
+
+    case WM_SETFOCUS:
+        {
+            /* Create a caret when a ScrollBar get focus*/
+            RECT rect;
+            int arrowSize, thumbSize, thumbPos, vertical;
+            if(hwnd==GetFocus())
+            {
+                vertical = SCROLL_GetScrollBarRect( hwnd, SB_CTL, &rect,
+                                                    &arrowSize, &thumbSize, &thumbPos );
+                if (!vertical)
+                {
+                    CreateCaret(hwnd,1, thumbSize-2, rect.bottom-rect.top-2);
+                    SetCaretPos(thumbPos+1, rect.top+1);
+                }
+                else
+                {
+                    CreateCaret(hwnd,1, rect.right-rect.left-2,thumbSize-2);
+                    SetCaretPos(rect.top+1, thumbPos+1);
+                }
+                ShowCaret(hwnd);
+            }
+        }
+        break;
+
+    case WM_KILLFOCUS:
+        {
+            RECT rect;
+            int arrowSize, thumbSize, thumbPos, vertical;
+            vertical = SCROLL_GetScrollBarRect( hwnd, SB_CTL, &rect,&arrowSize, &thumbSize, &thumbPos );
+            if (!vertical){
+                rect.left=thumbPos+1;
+                rect.right=rect.left+thumbSize;
+            }
+            else
+            {
+                rect.top=thumbPos+1;
+                rect.bottom=rect.top+thumbSize;
+            }
+            HideCaret(hwnd);
+            InvalidateRect(hwnd,&rect,0);
+            DestroyCaret();
+        }
+        break;
+
     case WM_ERASEBKGND:
          return 1;
 
