예제 #1
0
            public void Convert(ref Win16.CREATESTRUCT cs16, out Win32.CREATESTRUCT cs32)
            {
                if (cs16.lpCreateParams != 0 && !WindowClass.IsRegistered(_machine.ReadString(cs16.lpszClassName)))
                {
                    throw new NotImplementedException("CREATESTRUCT.lpCreateParams not supported");
                }

                // Convert it
                cs32.lpCreateParams = BitUtils.DWordToIntPtr(cs16.lpCreateParams);
                cs32.hInstance      = IntPtr.Zero;
                cs32.x             = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.x);
                cs32.y             = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.y);
                cs32.cx            = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.cx);
                cs32.cy            = (short)(cs16.cx == Win16.CW_USEDEFAULT ? Win16.CW_USEDEFAULT : cs16.cy);
                cs32.dwExStyle     = cs16.dwExStyle;
                cs32.style         = cs16.style;
                cs32.lpszClassName = GetString(cs16.lpszClassName);
                cs32.lpszName      = GetString(cs16.lpszName);

                if ((cs16.style & Win16.WS_CHILD) != 0)
                {
                    cs32.hMenu = (IntPtr)cs16.hMenu;
                }
                else
                {
                    cs32.hMenu = HMENU.Map.To32(cs16.hMenu);
                }

                cs32.hWndParent = HWND.Map.To32(cs16.hWndParent);
            }
예제 #2
0
        public override IntPtr Call16from32(Machine machine, bool hook, bool dlgproc, ref Win32.MSG msg32, ref Win16.MSG msg16, Func <uint> callback)
        {
            var info = GetInfo(machine, msg32.hWnd);

            // Do we need to clean up after this call?
            bool cleanup = !_nc && info.WM_CREATE_Pending;

            IntPtr saveStruct32 = info.Struct32;
            uint   saveStruct16 = info.Struct16;
            ushort saveSP       = machine.sp;

            try
            {
                // Store the 32-bit struct pointer
                info.Struct32 = msg32.lParam;

                // Allocate a 16-bit struct on the stack (unless one already exists)
                if (info.Struct16 == 0)
                {
                    machine.sp   -= (ushort)Marshal.SizeOf <Win16.CREATESTRUCT>();
                    info.Struct16 = BitUtils.MakeDWord(machine.sp, machine.ss);
                }

                // Convert
                Win32.CREATESTRUCT cs32 = Marshal.PtrToStructure <Win32.CREATESTRUCT>(msg32.lParam);
                Win16.CREATESTRUCT cs16;
                info.Convert(ref cs32, out cs16);
                machine.WriteStruct(info.Struct16, ref cs16);

                // Call
                msg16.wParam = 0;
                msg16.lParam = info.Struct16;
                var retv = callback();

                // Convert back
                cs16 = machine.ReadStruct <Win16.CREATESTRUCT>(info.Struct16);
                info.Convert(ref cs16, out cs32);
                Marshal.StructureToPtr(cs32, msg32.lParam, false);

                if (_nc)
                {
                    // If failed by WM_NCCREATE and we're top of the stack then clean up info
                    if (retv == 0 && saveStruct32 == IntPtr.Zero)
                    {
                        cleanup = true;
                    }

                    return((IntPtr)(retv == 0 ? 0 : 1));
                }
                else
                {
                    return((IntPtr)(retv == 0 ? 0 : -1));
                }
            }
            finally
            {
                info.Struct32 = saveStruct32;
                info.Struct16 = saveStruct16;
                machine.sp    = saveSP;

                if (cleanup)
                {
                    info.Discard();
                }
            }
        }
예제 #3
0
        protected override void WndProc(ref Message m)
        {
            if (IsApply == false)
            {
                base.WndProc(ref m);
                return;
            }
            if (m.Msg == Win32.WM_NCCREATE)
            {
                Win32.CREATESTRUCT userdata = (Win32.CREATESTRUCT)Marshal.PtrToStructure(m.LParam, typeof(Win32.CREATESTRUCT));

                // store window instance pointer in window user data
                Win32.SetWindowLongPtr(new HandleRef(this, m.HWnd), Win32.GWLP_USERDATA, userdata.lpCreateParams);
            }
            switch (m.Msg)
            {
            case Win32.WM_NCCALCSIZE:
            {
                if ((int)m.WParam == 1 && borderless)
                {
                    Win32.NCCALCSIZE_PARAMS param = (Win32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(Win32.NCCALCSIZE_PARAMS));
                    adjust_maximized_client_rect(Handle, param.rgrc[0]);
                    m.Result = IntPtr.Zero;
                    return;
                }
                break;
            }

            case Win32.WM_NCHITTEST:
            {
                // When we have no border or title bar, we need to perform our
                // own hit testing to allow resizing and moving.
                if (borderless)
                {
                    m.Result = (IntPtr)hit_test(new Point((int)m.LParam));
                    return;
                }
                break;
            }

            case Win32.WM_NCACTIVATE:
            {
                if (!composition_enabled())
                {
                    // Prevents window frame reappearing on window activation
                    // in "basic" theme, where no aero shadow is present.
                    m.Result = (IntPtr)1;
                    return;
                }
                break;
            }

                //case Win32.WM_CLOSE:
                //    {
                //        //  Close();
                //        Win32.DestroyWindow(Handle);
                //        m.Result = IntPtr.Zero;
                //        return;
                //    }

                //case Win32.WM_DESTROY:
                //    {
                //        Environment.Exit(0);
                //        m.Result = IntPtr.Zero;
                //        return;
                //    }

                //case Win32.WM_KEYDOWN:
                //case Win32.WM_SYSKEYDOWN:
                //    {
                //        switch ((int)m.WParam)
                //        {
                //            case Win32.VK_F8: { borderless_drag = !borderless_drag; m.Result = IntPtr.Zero; return; }
                //            case Win32.VK_F9: { borderless_resize = !borderless_resize; m.Result = IntPtr.Zero; return; }
                //            case Win32.VK_F10: { set_borderless(!borderless); m.Result = IntPtr.Zero; return; }
                //            case Win32.VK_F11: { set_borderless_shadow(!borderless_shadow); m.Result = IntPtr.Zero; return; }
                //        }
                //        break;
                //    }
            }
            base.WndProc(ref m);
        }