private void setupInstance(IntPtr parentWindowHandle, Direct2DRendererOptions options)
        {
            ParentWindowHandle = parentWindowHandle;

            if (PInvoke.IsWindow(parentWindowHandle) == 0)
            {
                throw new Exception("The parent window does not exist");
            }

            PInvoke.RECT bounds = new PInvoke.RECT();
            PInvoke.GetRealWindowRect(parentWindowHandle, out bounds);

            int x = bounds.Left;
            int y = bounds.Top;

            int width  = bounds.Right - x;
            int height = bounds.Bottom - y;

            Window = new OverlayWindow(x, y, width, height);

            options.Hwnd = Window.WindowHandle;

            Graphics = new Direct2DRenderer(options);

            serviceThread = new Thread(new ThreadStart(windowServiceThread))
            {
                IsBackground = true,
                Priority     = ThreadPriority.BelowNormal
            };

            serviceThread.Start();
        }
        private void windowServiceThread()
        {
            PInvoke.RECT bounds = new PInvoke.RECT();

            while (!exitThread)
            {
                Thread.Sleep(100);

                if (PInvoke.IsWindowVisible(ParentWindowHandle) == 0)
                {
                    if (Window.IsVisible)
                    {
                        Window.HideWindow();
                    }
                    continue;
                }

                if (!Window.IsVisible)
                {
                    Window.ShowWindow();
                }

                if (OverlayWindow.BypassTopmost)
                {
                    IntPtr windowAboveParentWindow = PInvoke.GetWindow(ParentWindowHandle, 3 /* GW_HWNDPREV */);

                    if (windowAboveParentWindow != Window.WindowHandle)
                    {
                        PInvoke.SetWindowPos(Window.WindowHandle, windowAboveParentWindow, 0, 0, 0, 0, 0x10 | 0x2 | 0x1 | 0x4000); // SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS
                    }
                }

                PInvoke.GetRealWindowRect(ParentWindowHandle, out bounds);

                int x = bounds.Left;
                int y = bounds.Top;

                int width  = bounds.Right - x;
                int height = bounds.Bottom - y;

                if (Window.X == x &&
                    Window.Y == y &&
                    Window.Width == width &&
                    Window.Height == height)
                {
                    continue;
                }

                Window.SetWindowBounds(x, y, width, height);
                Graphics.Resize(width, height);
            }
        }