diff --git a/src/gui_w48.c b/src/gui_w48.c
index 1096ec8..034d79e 100644
--- a/src/gui_w48.c
+++ b/src/gui_w48.c
@@ -2998,6 +2998,22 @@ get_scroll_flags(void)
 }
 
 /*
+ * On some Intel GPUs, the regions drawn just prior to ScrollWindowEx()
+ * may not be scrolled out properly.
+ *
+ * For gVim, when _OnScroll() is repeated, the character at the
+ * previous cursor position may be left drawn after scroll.
+ *
+ * The problem can be avoided by calling GetPixel() to get a pixel in
+ * the region before ScrollWindowEx().
+ */
+    static void
+intel_gpu_workaround(void)
+{
+    GetPixel(s_hdc, FILL_X(gui.col), FILL_Y(gui.row));
+}
+
+/*
  * Delete the given number of lines from the given row, scrolling up any
  * text further down within the scroll region.
  */
@@ -3008,6 +3024,8 @@ gui_mch_delete_lines(
 {
     RECT	rc;
 
+    intel_gpu_workaround();
+
     rc.left = FILL_X(gui.scroll_region_left);
     rc.right = FILL_X(gui.scroll_region_right + 1);
     rc.top = FILL_Y(row);
@@ -3039,6 +3057,8 @@ gui_mch_insert_lines(
 {
     RECT	rc;
 
+    intel_gpu_workaround();
+
     rc.left = FILL_X(gui.scroll_region_left);
     rc.right = FILL_X(gui.scroll_region_right + 1);
     rc.top = FILL_Y(row);
