My current desktop resolution is 1280x1024. I can't change to a lower one. If change the resolution in my monitor properties, and then run the program, when the resolution should change to 800x600, it changes to 1280x1024 directly.
But worst of all, the ChangeDisplaySetting function always returns DISP_CHANGE_SUCCESSFUL.
1# What's wrong with this??
2# Is there another good way to change my desktop resolution??

When a Win32 API isn't behaving as you expect, go back and [re]read the documentation.

From MSDN: ChangeDisplaySettingsRemarks
To ensure that the DEVMODE structure passed to ChangeDisplaySettings is valid and contains only values supported by the display driver, use the DEVMODE returned by the EnumDisplaySettings function.

You can use this (C++) code to find the best display mode for a particular width, height, and bit depth: