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); }
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(); } } }
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); }