diff --git a/sys/d3dvideosink/d3dhelpers.c b/sys/d3dvideosink/d3dhelpers.c
index 28815d6..9ca9eaf 100644
--- a/sys/d3dvideosink/d3dhelpers.c
+++ b/sys/d3dvideosink/d3dhelpers.c
@@ -1820,9 +1820,20 @@ end:
   return ret;
 }
 
+#define IWVTU_FULL    1
+#define IWVTU_PARTIAL 2
+#define IWVTU_HIDDEN  3
+#define IWVTU_ERROR   4
+
 GstFlowReturn
 d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
 {
+  UINT uRetVal = IWVTU_ERROR;
+  int iClipRes;
+  HDC hdcWnd;
+  RECT rcWndClient;
+  RECT rcWndClip;
+	
   GstFlowReturn ret = GST_FLOW_OK;
   GstMemory *mem;
   LPDIRECT3DSURFACE9 surface = NULL;
@@ -1844,6 +1855,38 @@ d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
     GST_LOG_OBJECT (sink, "Device lost, waiting for reset..");
     goto end;
   }
+  
+  /* check for window handle visibility, if hidden skip frame rendering  */
+   
+  hdcWnd = GetDC (sink->d3d.window_handle);
+  GetClientRect (sink->d3d.window_handle, &rcWndClient);
+  iClipRes = GetClipBox (hdcWnd, &rcWndClip);
+  ReleaseDC (sink->d3d.window_handle, hdcWnd);
+  
+  switch (iClipRes)
+  {
+	 case NULLREGION:
+		uRetVal = IWVTU_HIDDEN;
+		break;
+	 case SIMPLEREGION:
+		if (EqualRect (&rcWndClip, &rcWndClient))
+		   uRetVal = IWVTU_FULL;
+		else
+		   uRetVal = IWVTU_PARTIAL;
+		break;
+	 case COMPLEXREGION:
+		uRetVal = IWVTU_PARTIAL;
+		break;
+	 default:
+		uRetVal = IWVTU_ERROR;
+		break;
+  }
+  
+  if (uRetVal == IWVTU_HIDDEN)
+  {
+	  GST_DEBUG_OBJECT (sink, "Hidden hwnd, skipping frame rendering...");
+	  goto end;
+  }
 
   GST_INFO_OBJECT (sink, "%s %" GST_TIME_FORMAT,
       (sink->d3d.window_handle != NULL) ? "Render" : "No Win",
