Вот родил уродца:ОСТОРОЖНО ЭКСПЕРИМЕТНАЛЬНЫЙ ГОВНОКОД. ПРОВЕРОК ВЫХОДА ЗА ГРАНИЦЫ НЕТ
## Код:
```
MODULE SmartMWheel;

IMPORT WinApi, StdLog, HostWindows, SYSTEM;

TYPE

   MouseHookStructEx = POINTER TO RECORD [untagged]
      pt*: WinApi.POINT;
      hwnd*: WinApi.HWND;
      wHitTestCode*: INTEGER;
      dwExtraInfo*: INTEGER;
      mousedata*: INTEGER;
   END;
      

VAR
   
   thrd, mythrd: WinApi.HANDLE;
   mhook: WinApi.HHOOK;
   Handler: PROCEDURE(code: INTEGER; wparam: WinApi.WPARAM; lparam: WinApi.LPARAM): INTEGER;
   hinst: WinApi.HINSTANCE; 
   ticks: INTEGER;
   lpThreadId: INTEGER;
   Stop: BOOLEAN;
   wnd: HostWindows.Window;
   
   bufdelta: INTEGER;
   
PROCEDURE ThreadRoutine(lpThreadParameter: WinApi.PtrVoid): INTEGER;
VAR   
   a: INTEGER;
   Pos, res: INTEGER;
BEGIN
   
   WHILE ~Stop DO
      
      Pos := WinApi.GetScrollPos(wnd.wnd, WinApi.SB_VERT);
      IF bufdelta # 0 THEN
      (*res := WinApi.SetScrollPos(wnd.wnd, WinApi.SB_VERT, y + bufdelta, 1);*)
      res := WinApi.PostMessageW(wnd.wnd, WinApi.WM_VSCROLL, WinApi.SB_THUMBPOSITION + 10000H * (Pos - bufdelta * 5), 0);
      bufdelta:= 0;
      (*a := WinApi.Beep(100,100);*)
      END;
      
      WinApi.Sleep(0);
   END;
   
   RETURN 0;
END ThreadRoutine;
   
PROCEDURE Do*();
BEGIN
   Stop := FALSE;
   mhook := WinApi.SetWindowsHookEx(WinApi.WH_MOUSE, Handler, 0, thrd);
   mythrd := WinApi.CreateThread(NIL, WinApi.NULL, ThreadRoutine, 0, {}, lpThreadId);
END Do;

PROCEDURE Undo*;
BEGIN
   Stop := TRUE;
   IF WinApi.UnhookWindowsHookEx(mhook) = 0 THEN
      StdLog.String("Hook NOT deleted");
   ELSE
      StdLog.String("Hook deleted");
   END;
   StdLog.Int(bufdelta);
END Undo;

PROCEDURE HandlerProc(code: INTEGER; wparam: WinApi.WPARAM; lparam: WinApi.LPARAM): INTEGER;
VAR
   res, delta: INTEGER;
   msg2: WinApi.PtrMOUSEHOOKSTRUCT;
   msg3: MouseHookStructEx;
BEGIN
   
   wnd := HostWindows.dir.First(); 
   
   CASE wparam OF
      | WinApi.WM_MOUSEWHEEL:
         
         msg3 := SYSTEM.VAL(MouseHookStructEx, lparam);
         
         delta := msg3.mousedata DIV 10000H;
         bufdelta := bufdelta + delta;
         StdLog.String("Wheel"); StdLog.Ln;
         ticks := WinApi.GetTickCount();
         StdLog.Int(bufdelta); StdLog.Ln;
         RETURN -1; (*WinApi.CallNextHookEx(WinApi.WM_NULL, code, wparam, lparam);*)
         
   ELSE
         RETURN WinApi.CallNextHookEx(WinApi.WM_NULL, code, wparam, lparam);
   END;
END HandlerProc;

BEGIN
   
   ticks := 0;
   Handler := HandlerProc;
   thrd := WinApi.GetCurrentThreadId();
   Stop := FALSE;
   
CLOSE
   IF mhook # WinApi.NULL THEN
      Undo
   END;
END SmartMWheel.

SmartMWheel.Do
SmartMWheel.Undo
```


Можно проверить на WinApi. Говнокод прокручивает без мерцания

С удовольствием приму советы по доведению этого г до ума