Javik Posted January 18, 2013 Posted January 18, 2013 I am trying to make my own multi-monitor resolution changer. (yes, there are already examples of this.) I am trying to better understand what is going on here.When I look up the Microsoft TechNet info for these functions I see this:EnumDisplaySettings function (Windows)http://msdn.microsoft.com/en-us/library/windows/desktop/dd162611%28v=vs.85%29.aspxWhich says it needs a DevMode struct, described here:DEVMODE structure (Windows)http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565%28v=vs.85%29.aspxOkay, that DevMode struct is huge, many many lines.But when I search the forums for examples of people getting the screen resolutions, their DevMode struct is tiny. It looks nothing like that:Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")I am not a DLLCall expert at all, but it is mysterious to me how Windows knows to put the right data in the right spot in that tiny struct that doesn't look anything like the proper struct in the Microsoft specifications.
Mat Posted January 18, 2013 Posted January 18, 2013 As far as windows is constant, that struct is a block of memory of a known size. It stores the data at a given offset in the struct, which is hard coded at compile time. Local $tFirst = DllStructCreate("int Foo; int Bar; int Meh") DllStructSetData($tFirst, "Foo", 123) DllStructSetData($tFirst, "Bar", 456) DllStructSetData($tFirst, "Meh", 789) ConsoleWrite("Before: " & @LF) ConsoleWrite(@TAB & "Foo: " & DllStructGetData($tFirst, "Foo") & @LF) ConsoleWrite(@TAB & "Bar: " & DllStructGetData($tFirst, "Bar") & @LF) ConsoleWrite(@TAB & "Meh: " & DllStructGetData($tFirst, "Meh") & @LF) ; Using the 2nd parameter of DllStructCreate, the structures now overlap Local $tSecond = DllStructCreate("int Meh", DllStructGetPtr($tFirst) + 8) DllStructSetData($tSecond, "Meh", 987) ConsoleWrite("After: " & @LF) ConsoleWrite(@TAB & "Foo: " & DllStructGetData($tFirst, "Foo") & @LF) ConsoleWrite(@TAB & "Bar: " & DllStructGetData($tFirst, "Bar") & @LF) ConsoleWrite(@TAB & "Meh: " & DllStructGetData($tFirst, "Meh") & @LF) However, by my maths those structs are only 128 bytes, and the one on msdn is 220. Don't suppose that really matters as long as you set dmSize. AutoIt Project Listing
Shaggi Posted January 18, 2013 Posted January 18, 2013 you can check this topic, i updated the devmode struct for it - it worked last i checked but basically, the size may change over different windows versions for new features - thats why you can set the size so windows can identify what version you're assuming Ever wanted to call functions in another process? ProcessCall UDFConsole stuff: Console UDFC Preprocessor for AutoIt OMG
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now