예제 #1
0
        void OnDlgMove(object sender, EventArgs e)
        {
            if (!NativeMethods.IsWindow(m_FakeWndHandle))
            {
                return;
            }

            NativeMethods.MoveWindow(m_FakeWndHandle, this.Left, this.Top, this.Width, this.Height, false);
            RefreshFakeWnd();
        }
예제 #2
0
        void HookChildControl(Control ctrl)
        {
            if (NativeMethods.IsWindow(ctrl.Handle))
            {
                m_WndProcMap[ctrl.Handle] = NativeMethods.GetWindowLongPtr(ctrl.Handle, WindowsLong.GWL_WNDPROC);
                NativeMethods.SetWindowLongPtr(ctrl.Handle, GWL.GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(m_CtrlWndProcDelegate));
            }

            if (!ctrl.HasChildren)
            {
                return;
            }
            foreach (Control child in ctrl.Controls)
            {
                HookChildControl(child);
            }
        }
예제 #3
0
        protected void CreateFakeWnd()
        {
            WNDCLASSEX wndClsEx = new WNDCLASSEX();

            wndClsEx.Init();
            wndClsEx.style         = WndClassType.CS_VREDRAW | WndClassType.CS_HREDRAW;
            wndClsEx.lpfnWndProc   = m_DefWndProcDelegate;
            wndClsEx.cbClsExtra    = 0;
            wndClsEx.cbWndExtra    = 0;
            wndClsEx.hInstance     = NativeMethods.GetModuleHandle(null);
            wndClsEx.hIcon         = IntPtr.Zero;
            wndClsEx.hIconSm       = IntPtr.Zero;
            wndClsEx.hCursor       = IntPtr.Zero;
            wndClsEx.hbrBackground = IntPtr.Zero;
            wndClsEx.lpszClassName = m_WndClsName;
            wndClsEx.lpszMenuName  = null;

            bool success = NativeMethods.RegisterClassEx(ref wndClsEx) != 0;

            Debug.Assert(success, "RegisterWndClass failed.");
            UInt32 dwExStyle = WS_EX.WS_EX_LAYERED |
                               WS_EX.WS_EX_TRANSPARENT |
                               WS_EX.WS_EX_NOACTIVATE |
                               WS_EX.WS_EX_LEFT;
            UInt32 dwStyle = (uint)WindowStyle.WS_VISIBLE | (uint)WindowStyle.WS_OVERLAPPED;

            m_FakeWndHandle = NativeMethods.CreateWindowEx((Int32)dwExStyle
                                                           , m_WndClsName
                                                           , null
                                                           , (Int32)dwStyle
                                                           , this.Left
                                                           , this.Top
                                                           , m_BgImg.Width
                                                           , m_BgImg.Height
                                                           , this.Handle
                                                           , IntPtr.Zero
                                                           , NativeMethods.GetModuleHandle(null)
                                                           , IntPtr.Zero
                                                           );
            Debug.Assert(NativeMethods.IsWindow(m_FakeWndHandle), "CreateWindowEx failed.");
        }
예제 #4
0
        protected void RefreshFakeWnd()
        {
            if (m_bIsRefreshing)
            {
                return;
            }

            if (!NativeMethods.IsWindow(m_FakeWndHandle))
            {
                return;
            }

            m_bIsRefreshing = true;
            POINT         ptSrc    = new POINT(0, 0);
            POINT         ptWinPos = new POINT(this.Left, this.Top);
            SIZE          szWin    = new SIZE(m_BgImg.Width, m_BgImg.Height);
            byte          biAlpha  = 0xFF;
            BLENDFUNCTION stBlend  = new BLENDFUNCTION(BlendOp.AC_SRC_OVER, 0, biAlpha, BlendOp.AC_SRC_ALPHA);

            IntPtr hDC = NativeMethods.GetDC(m_FakeWndHandle);

            if (hDC == IntPtr.Zero)
            {
                m_bIsRefreshing = false;
                Debug.Assert(false, "GetDC failed.");
                return;
            }

            IntPtr hdcMemory = NativeMethods.CreateCompatibleDC(hDC);

            int nBytesPerLine = ((m_BgImg.Width * 32 + 31) & (~31)) >> 3;
            BITMAPINFOHEADER stBmpInfoHeader = new BITMAPINFOHEADER();

            stBmpInfoHeader.Init();
            stBmpInfoHeader.biWidth       = m_BgImg.Width;
            stBmpInfoHeader.biHeight      = m_BgImg.Height;
            stBmpInfoHeader.biPlanes      = 1;
            stBmpInfoHeader.biBitCount    = 32;
            stBmpInfoHeader.biCompression = CompressionType.BI_RGB;
            stBmpInfoHeader.biClrUsed     = 0;
            stBmpInfoHeader.biSizeImage   = (uint)(nBytesPerLine * m_BgImg.Height);

            IntPtr pvBits  = IntPtr.Zero;
            IntPtr hbmpMem = NativeMethods.CreateDIBSection(hDC
                                                            , ref stBmpInfoHeader
                                                            , DIBColorTableIdentifier.DIB_RGB_COLORS
                                                            , out pvBits
                                                            , IntPtr.Zero
                                                            , 0
                                                            );

            Debug.Assert(hbmpMem != IntPtr.Zero, "CreateDIBSection failed.");

            if (hbmpMem != null)
            {
                IntPtr hbmpOld = NativeMethods.SelectObject(hdcMemory, hbmpMem);

                Graphics graphic = Graphics.FromHdcInternal(hdcMemory);

                graphic.DrawImage(m_BgImg, 0, 0, m_BgImg.Width, m_BgImg.Height);

                foreach (Control ctrl in this.Controls)
                {
                    if (!ctrl.Visible)
                    {
                        continue;
                    }

                    using (Bitmap bmp = new Bitmap(ctrl.Width, ctrl.Height))
                    {
                        Rectangle rect = new Rectangle(0, 0, ctrl.Width, ctrl.Height);
                        ctrl.DrawToBitmap(bmp, rect);

                        graphic.DrawImage(bmp, ctrl.Left, ctrl.Top, ctrl.Width, ctrl.Height);
                    }
                }

                GUITHREADINFO stGuiThreadInfo = new GUITHREADINFO();
                stGuiThreadInfo.Init();
                if (NativeMethods.GetGUIThreadInfo((uint)NativeMethods.GetCurrentThreadId(), ref stGuiThreadInfo))
                {
                    if (NativeMethods.IsWindow(stGuiThreadInfo.hwndCaret))
                    {
                        int   height  = stGuiThreadInfo.rcCaret.Bottom - stGuiThreadInfo.rcCaret.Top;
                        POINT ptCaret = new POINT(stGuiThreadInfo.rcCaret.Left, stGuiThreadInfo.rcCaret.Top);

                        NativeMethods.ClientToScreen(stGuiThreadInfo.hwndCaret, ref ptCaret);
                        NativeMethods.ScreenToClient(this.Handle, ref ptCaret);

                        graphic.DrawLine(new Pen(new SolidBrush(Color.Black))
                                         , ptCaret.X
                                         , ptCaret.Y
                                         , ptCaret.X
                                         , ptCaret.Y + height
                                         );
                    }
                }


                NativeMethods.UpdateLayeredWindow(m_FakeWndHandle
                                                  , hDC
                                                  , ref ptWinPos
                                                  , ref szWin
                                                  , hdcMemory
                                                  , ref ptSrc
                                                  , 0
                                                  , ref stBlend
                                                  , UpdateLayerWindowParameter.ULW_ALPHA
                                                  );

                graphic.Dispose();
                NativeMethods.SelectObject(hbmpMem, hbmpOld);
                NativeMethods.DeleteObject(hbmpMem);
            }

            NativeMethods.DeleteDC(hdcMemory);
            NativeMethods.DeleteDC(hDC);

            m_bIsRefreshing = false;
        }