--[===[ Author: YoucefHam Email: youcefham20@gmail.com Discord: YoucefHam#5634 ADD to Memory Viewer window the Menu "Window" "Vertical", => The default Cheat Engine window. "Horizontal", => Make the Found list and Address List Side by Side. "Auto Switch", => Enable/Disable change mode automatically when the windows is maximized ADD to Memory Viewer window the Menu "Code" & "Hex" "Code", => Hide/Show the Hex Viewer. "Hex", => Hide/Show the Disassembler. ]===] local Use_One_Menu = false local function MemoViwe_Wide_Window(MemoView) local MemoView = MemoView or getMemoryViewForm() if MemoView.Menu.Items.miWideWindow ~= nil then return end local MemoView_WW_State = false local MemoView_WW_State_ = false local MemoView_WWDisassembler_State = false local MemoView_WWHexView_State = false local MemoView_WW_AutoSwitch = false local SavePosition_State = true local WindowStateChangeing_State = false local Splitter = MemoView['Splitter1'] local Disassembler = MemoView['Panel1'] local HexView = MemoView['Panel4'] local function MemoView_miWWVerticalClick() end local function MemoView_miWWHorizontalClick() end local function MemoView_miWWAutoSwitchClick() end local function MemoViewWW_AddMenu() end local function MemoView_miWWDisassemblerClick() end local function MemoView_miWWHexViewClick() end local function MemoView_WWLoadPosition() end local function MemoView_WWSavePosition() end local CESettings = getSettings('Wide Window\\MemoView_'..getCEVersion()) if CESettings.Value['MemoView_WW_AutoSwitch'] ~= '' then if CESettings.Value['MemoView_WW_AutoSwitch'] == 'true' then MemoView_WW_AutoSwitch = true else MemoView_WW_AutoSwitch = false end else CESettings.Value['MemoView_WW_AutoSwitch'] = tostring(MemoView_WW_AutoSwitch) end -- Set Default values for MemoView if #(CESettings.getBinaryValue(MemoView.Name..'_Pos_NV')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(MemoView.Top) Form_Pos.writeDword(MemoView.Left) Form_Pos.writeDword(MemoView.Width) Form_Pos.writeDword(MemoView.Height) CESettings.setBinaryValue(MemoView.Name..'_Pos_'..'NV',Form_Pos) Form_Pos.destroy() end if #(CESettings.getBinaryValue(MemoView.Name..'_Pos_NH')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(MemoView.Top) Form_Pos.writeDword(MemoView.Left) Form_Pos.writeDword(MemoView.Width * 1.8) Form_Pos.writeDword(MemoView.Height) CESettings.setBinaryValue(MemoView.Name..'_Pos_'..'NH',Form_Pos) Form_Pos.destroy() end if #(CESettings.getBinaryValue(MemoView.Name..'_Pos_MV')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(-5) Form_Pos.writeDword(-5) Form_Pos.writeDword(getScreenWidth()) Form_Pos.writeDword(getScreenHeight() * 0.95) CESettings.setBinaryValue(MemoView.Name..'_Pos_'..'MV',Form_Pos) Form_Pos.destroy() end if #(CESettings.getBinaryValue(MemoView.Name..'_Pos_MH')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(-5) Form_Pos.writeDword(-5) Form_Pos.writeDword(getScreenWidth()) Form_Pos.writeDword(getScreenHeight() * 0.95) CESettings.setBinaryValue(MemoView.Name..'_Pos_'..'MH',Form_Pos) Form_Pos.destroy() end -- Set Default values for HexView if #(CESettings.getBinaryValue(HexView.Name..MemoView.Name..'_Pos_'..'NV')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(0) Form_Pos.writeDword(0) Form_Pos.writeDword(MemoView.Width) Form_Pos.writeDword(MemoView.Height / 2) CESettings.setBinaryValue(HexView.Name..MemoView.Name..'_Pos_'..'NV',Form_Pos) Form_Pos.destroy() end if #(CESettings.getBinaryValue(HexView.Name..MemoView.Name..'_Pos_NH')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(0) Form_Pos.writeDword(0) Form_Pos.writeDword(MemoView.Width / 2) Form_Pos.writeDword(MemoView.Height) CESettings.setBinaryValue(HexView.Name..MemoView.Name..'_Pos_'..'NH',Form_Pos) Form_Pos.destroy() end if #(CESettings.getBinaryValue(HexView.Name..MemoView.Name..'_Pos_MV')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(0) Form_Pos.writeDword(0) Form_Pos.writeDword(MemoView.Width) Form_Pos.writeDword(MemoView.Height / 2) CESettings.setBinaryValue(HexView.Name..MemoView.Name..'_Pos_'..'MV',Form_Pos) Form_Pos.destroy() end if #(CESettings.getBinaryValue(HexView.Name..MemoView.Name..'_Pos_MH')) <= 0 then local Form_Pos = createStringStream() Form_Pos.writeDword(0) Form_Pos.writeDword(0) Form_Pos.writeDword(MemoView.Width / 2) Form_Pos.writeDword(MemoView.Height) CESettings.setBinaryValue(HexView.Name..MemoView.Name..'_Pos_'..'MH',Form_Pos) Form_Pos.destroy() end --[[ Save form position (Top, Left, Width, Height) ]] function MemoView_WWSavePosition(Form,Condition,Status) if Condition == true then local Form_Pos = createStringStream() Form_Pos.writeDword(Form.Top) Form_Pos.writeDword(Form.Left) Form_Pos.writeDword(Form.Width) Form_Pos.writeDword(Form.Height) CESettings.setBinaryValue(Form.Name..(Form.Parent and Form.Parent.Name or '')..'_Pos_'..Status,Form_Pos) Form_Pos.destroy() end end --[[ Load and set form position (t:Top, l:Left, w:Width, h:Height) ]] function MemoView_WWLoadPosition(Form,Conditions,properties,Status) if Conditions == true then if (properties ~= '' or properties ~= nil) and string.match(properties:lower(),'[tlwh]+') ~= nil then local Form_Pos = createStringStream() Form_Pos.write( CESettings.getBinaryValue(Form.Name..(Form.Parent and Form.Parent.Name or '')..'_Pos_'..Status)) if #(CESettings.getBinaryValue(Form.Name..(Form.Parent and Form.Parent.Name or '')..'_Pos_'..Status)) <= 0 then return end if string.match(properties:lower(),'[t]+') ~= nil then Form_Pos.Position = 0 Form.Top = Form_Pos.readDword() end if string.match(properties:lower(),'[l]+') ~= nil then Form_Pos.Position = 4 Form.Left = Form_Pos.readDword() end if string.match(properties:lower(),'[w]+') ~= nil then Form_Pos.Position = 8 Form.Width = Form_Pos.readDword() end if string.match(properties:lower(),'[h]+') ~= nil then Form_Pos.Position = 12 Form.Height = Form_Pos.readDword() end Form_Pos.destroy() end end end --Set window to Vertical mode function MemoView_miWWVerticalClick() if not MemoView_WW_State then return end MemoView_WW_State = false SavePosition_State = false MemoView.Menu.Items.miWideWindow.miWWHorizontal.Checked = false MemoView.Menu.Items.miWideWindow.miWWVertical.Checked = true --Make Items Visible Splitter.Visible = false --Splitter Disassembler.Visible = false --Disassembler HexView.Visible = false --HexView --Load MemoView Width MemoView_WWLoadPosition( MemoView, MemoView.WindowState ~= 'wsMinimized', 'w', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'V') Disassembler.Constraints.MinWidth = 0 Disassembler.Constraints.MinHeight = 100 HexView.Constraints.MinWidth = 0 HexView.Constraints.MinHeight = 100 --Adjust Splitter to the bottom of the Disassembler Splitter.Align = alBottom Splitter.Top = Disassembler.Height --HexView.Top - Splitter.Height Splitter.Left = 0 Splitter.Visible = true --Splitter --Adjust HexView to the bottom of the window HexView.Align = alBottom HexView.Top = Splitter.Top + Splitter.Height HexView.Left = 0 HexView.BorderSpacing.Left = 0 HexView.BorderSpacing.Top = 2 --Load Disassembler Height MemoView_WWLoadPosition( HexView, true , 'h', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'V') HexView.Visible = true --HexView --Adjust Disassembler to the Top Disassembler.Align = alClient Disassembler.Top = 0 Disassembler.Left = 0 Disassembler.BorderSpacing.Right = 0 Disassembler.BorderSpacing.Bottom = 2 Disassembler.Visible = true --Disassembler if Disassembler.Height > MemoView.Height then Disassembler.Height = MemoView.Height / 2 MemoView_WWSavePosition( HexView, true , (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'V') end SavePosition_State = true end --Set window to Horizontal mode function MemoView_miWWHorizontalClick() if MemoView_WW_State then return end MemoView_WW_State = true SavePosition_State = false MemoView.Menu.Items.miWideWindow.miWWVertical.Checked = false MemoView.Menu.Items.miWideWindow.miWWHorizontal.Checked = true --Make Items Visible Disassembler.Visible = false --Disassembler Splitter.Visible = false --Splitter HexView.Visible = false --HexView --Load MemoView Width MemoView_WWLoadPosition( MemoView, MemoView.WindowState ~= 'wsMinimized', 'w', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'H') Disassembler.Constraints.MinWidth = 100 Disassembler.Constraints.MaxWidth = 0 Disassembler.Constraints.MinHeight = 100 Disassembler.Constraints.MaxHeight = 0 HexView.Constraints.MinWidth = 100 HexView.Constraints.MaxWidth = 0 HexView.Constraints.MinHeight = 100 HexView.Constraints.MaxHeight = 0 --Adjust Disassembler to the Left Disassembler.Align = alClient Disassembler.Top = 0 Disassembler.Left = 0 Disassembler.BorderSpacing.Right = 2 Disassembler.BorderSpacing.Bottom = 0 Disassembler.Visible = true --Disassembler --Adjust Splitter to the right of the Disassembler Splitter.Align = alRight Splitter.Top = 0 --HexView.Top Splitter.Left = Disassembler.Width --HexView.Left - Splitter.Width Splitter.Visible = true --Splitter --Adjust HexView to the right of the window HexView.Align = alRight HexView.Top = 0 HexView.Left = Splitter.Left + Splitter.Width HexView.BorderSpacing.Left = 2 HexView.BorderSpacing.Top = 0 --Load Disassembler Width MemoView_WWLoadPosition( HexView, true , 'w', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'H') HexView.Visible = true --HexView if Disassembler.Width > MemoView.Width then Disassembler.Width = MemoView.Width / 2 MemoView_WWSavePosition( HexView, true , (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'H') end SavePosition_State = true end --Set window to Auto Switch if window Maximized function MemoView_miWWAutoSwitchClick(sender) sender.Checked = true if MemoView_WW_AutoSwitch == true then MemoView_WW_AutoSwitch = false sender.RadioItem = true else MemoView_WW_AutoSwitch = true sender.RadioItem = false if not MemoView_WW_State and MemoView.WindowState == 'wsMaximized' then MemoView_miWWHorizontalClick() MemoView_WWLoadPosition( HexView, true , 'w', 'MH') end end CESettings.Value['MemoView_WW_AutoSwitch'] = tostring(MemoView_WW_AutoSwitch) end --Show/Hide Disassembler function MemoView_miWWHexViewClick() if MemoView_WW_State then if Disassembler.Visible == false then --Show Dissem H MemoView_WWDisassembler_State = false Splitter.Visible = true Disassembler.Enabled = true Disassembler.Visible = true MemoView_WW_State = false MemoView_miWWHorizontalClick() --Load Disassembler Width MemoView_WWLoadPosition( HexView, true , 'w', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'H') else --Hide Dissem H if HexView.Visible == false then MemoView_miWWDisassemblerClick() end MemoView_WWDisassembler_State = true Splitter.Visible = false Disassembler.Enabled = false Disassembler.Visible = false HexView.Align = alClient end else if Disassembler.Visible == false then --Show Dissem V MemoView_WWDisassembler_State = false Splitter.Visible = true Disassembler.Enabled = true Disassembler.Visible = true MemoView_WW_State = true MemoView_miWWVerticalClick() --Load Disassembler Width MemoView_WWLoadPosition( HexView, true , 'h', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'V') else --Hide Dissem V if HexView.Visible == false then MemoView_miWWDisassemblerClick() end MemoView_WWDisassembler_State = true Splitter.Visible = false Disassembler.Enabled = false Disassembler.Visible = false HexView.Align = alClient end end end --Show/Hide Hex View function MemoView_miWWDisassemblerClick() if MemoView_WW_State then if HexView.Visible == false then --Show Hxd H MemoView_WWHexView_State = false Splitter.Visible = true HexView.Enabled = true HexView.Visible = true MemoView_WW_State = false MemoView_miWWHorizontalClick() --Load Disassembler Width MemoView_WWLoadPosition( HexView, true , 'w', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'H') else --Hide Hxd H if Disassembler.Visible == false then MemoView_miWWHexViewClick() end MemoView_WWHexView_State = true Splitter.Visible = false HexView.Enabled = false HexView.Visible = false end else if HexView.Visible == false then --Show Hxd V MemoView_WWHexView_State = false Splitter.Visible = true HexView.Enabled = true HexView.Visible = true MemoView_WW_State = true MemoView_miWWVerticalClick() --Load Disassembler Width MemoView_WWLoadPosition( HexView, true , 'h', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'V') else --Hide Hxd V if Disassembler.Visible == false then MemoView_miWWHexViewClick() end MemoView_WWHexView_State = true Splitter.Visible = false HexView.Enabled = false HexView.Visible = false Disassembler.Align = alClient end end end -- Save Splitter position when Moved if Splitter.OnMoved ~= nil then if Old_Splitter_OnMoved == nil then local Old_Splitter_OnMoved = Splitter.OnMoved end end Splitter.OnMoved = function(...) MemoView_WWSavePosition( HexView, true , (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..(MemoView_WW_State and 'H' or 'V' )) if Old_Splitter_OnMoved ~= nil then Old_Splitter_OnMoved(...) end end --Save window position when moved or resized if MemoView.OnChangeBounds ~= nil then if Old_MemoView_OnChangeBounds == nil then local Old_MemoView_OnChangeBounds = MemoView.OnChangeBounds end end MemoView.OnChangeBounds = function(...) if Old_MemoView_OnChangeBounds ~= nil then Old_MemoView_OnChangeBounds(...) end createThread(function () sleep(300) MemoView_WWSavePosition(MemoView , WindowStateChangeing_State == false and MemoView.WindowState == 'wsNormal' and SavePosition_State == true , (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..(MemoView_WW_State and 'H' or 'V')) end) end --Set window to Horizontal mode when window is Maximized if MemoView.OnWindowStateChange ~= nil then if Old_MemoView_OnWindowStateChange == nil then local Old_MemoView_OnWindowStateChange = MemoView.OnWindowStateChange end end MemoView.OnWindowStateChange = function(...) if Old_MemoView_OnWindowStateChange ~= nil then Old_MemoView_OnWindowStateChange(...) end if MemoView.WindowState == 'wsMinimized' then return end SavePosition_State = false WindowStateChangeing_State = true if MemoView.WindowState == 'wsMaximized' then MemoView_WW_State_ = MemoView_WW_State if MemoView_WW_State == false and MemoView_WW_AutoSwitch == false then MemoView_WW_State = true MemoView_miWWVerticalClick() SavePosition_State = false else MemoView_WW_State = false MemoView_miWWHorizontalClick() SavePosition_State = false HexView.Width = MemoView.Width -- Fix Bug MemoView_WWLoadPosition( HexView, true , 'w', 'MH') -- Fix Bug end elseif MemoView.WindowState == 'wsNormal' then if MemoView_WW_State == true then if MemoView_WW_State_ == false then MemoView_WW_State = true MemoView_miWWVerticalClick() SavePosition_State = false else MemoView_WW_State = false MemoView_miWWHorizontalClick() SavePosition_State = false end else if MemoView_WW_State_ == true then MemoView_WW_State = false MemoView_miWWHorizontalClick() SavePosition_State = false else MemoView_WW_State = true MemoView_miWWVerticalClick() SavePosition_State = false end end end SavePosition_State = true WindowStateChangeing_State = false end --Make splitter resize Disassembler to minimum MemoView.Splitter1.OnCanResize = nil --Set window to Vertical mode when Showing Memory View if MemoView.OnShow ~= nil then if Old_MemoView_OnShow ~= nil then local Old_MemoView_OnShow = MemoView.OnShow end end MemoView.OnShow = function(...) if CESettings.Value['MemoView_WW_AutoSwitch'] == 'true' then MemoView_WW_AutoSwitch = true if MemoView.WindowState == 'wsMaximized' and MemoView_WW_AutoSwitch == true then MemoView_WW_State_ = false MemoView_miWWHorizontalClick() end MemoView_WWHexView_State = false MemoView_WWDisassembler_State = false else MemoView_WW_AutoSwitch = false MemoView_WW_State = false MemoView_WW_State_ = false end if Old_MemoView_OnShow ~= nil then return Old_MemoView_OnShow(...) end end --Set window to Vertical mode when Closing Memory View if MemoView.OnClose ~= nil then if Old_MemoView_OnClose ~= nil then local Old_MemoView_OnClose = MemoView.OnClose end end MemoView.OnClose = function(sender,option) if HexView.Visible == false then MemoView_miWWDisassemblerClick() end if Disassembler.Visible == false then MemoView_miWWHexViewClick() end MemoView_WWHexView_State = false MemoView_WWDisassembler_State = false MemoView_miWWVerticalClick() if Old_MemoView_OnClose ~= nil then return Old_MemoView_OnClose(sender,option) else return option end end --Set window to Vertical mode when showing Memory View if MemoView.OnShow ~= nil then if Old_MemoView_OnShow ~= nil then Old_MemoView_OnShow = MemoView.OnShow end end MemoView.OnShow = function (sender) if Old_MemoView_OnShow ~= nil then Old_MemoView_OnShow(sender) end MemoView_WWHexView_State = false MemoView_WWDisassembler_State = false MemoView_WW_State = true MemoView_WW_State_ = false MemoView_miWWVerticalClick() --Load MemoView Width MemoView_WWLoadPosition( MemoView, true, 'tl', (MemoView.WindowState == 'wsNormal' and 'N' or 'M')..'V') end --Add the wide window menu to new memory browser window if MemoView.Newwindow1.OnClick ~= nil then if Old_MemoView_Newwindow1_onClick ~= nil then Old_MemoView_Newwindow1_onClick = MemoView.Newwindow1.OnClick end end MemoView.Newwindow1.OnClick = function (sender) if Old_MemoView_Newwindow1_onClick ~= nil then Old_MemoView_Newwindow1_onClick(sender) end local MemoView_ = createMemoryView() MemoView_.show() MemoView_.caption = MemoView_.caption..' '..(MemoView_.Name):gsub('MemoryBrowser_','') MemoView_.bringToFront() MemoViwe_Wide_Window(MemoView_) end -- Create Menu Window local function addMenuItem(MenuItem, caption, onClick, Name, RadioItem, Checked) local newItem = createMenuItem(MenuItem) MenuItem.add(newItem) newItem.Caption = caption newItem.OnClick = onClick newItem.Name = Name or '' newItem.RadioItem = RadioItem or false newItem.Checked = Checked or false return newItem end local miWideWindow = addMenuItem(MemoView.Menu.Items,translate('&Window'),nil,'miWideWindow',false, false) addMenuItem(miWideWindow,translate('&Vertical'), MemoView_miWWVerticalClick,'miWWVertical',false,true) addMenuItem(miWideWindow,'-') addMenuItem(miWideWindow,translate('&Horizontal'), MemoView_miWWHorizontalClick,'miWWHorizontal') addMenuItem(miWideWindow,'-') addMenuItem(miWideWindow,translate('&Auto Switch'), MemoView_miWWAutoSwitchClick,'miWWAutoSwitch',not MemoView_WW_AutoSwitch,true) if Use_One_Menu == true then addMenuItem(miWideWindow,'-') end addMenuItem(Use_One_Menu == false and MemoView.Menu.Items or miWideWindow,translate('&Code'), MemoView_miWWDisassemblerClick,'miWWCode') if Use_One_Menu == true then addMenuItem(miWideWindow,'-') end addMenuItem(Use_One_Menu == false and MemoView.Menu.Items or miWideWindow,translate('&Hex'), MemoView_miWWHexViewClick,'miWWHex') return true end createThread(function() local StartTime = os.clock() local TimeOut = false while getMemoryViewForm() == nil do sleep(2000) if (os.clock() - StartTime >= 120) then TimeOut = true end end if not TimeOut then MemoViwe_Wide_Window() end end)