Most programs aren't coded to have all of their elements scale properly. You have icons, buttons, pictures, etc that may be bit mapped images, then you have other elements that are vector mapped. So if you just change the font size, you can read the text, but it may be in a text box that is too small (so it overflows).
So the best thing you can do, other than re-write all the applications that have been around for the last 30 years or more, is to make the app think it is writing to a display with a specific resolution. Then scale that up to whatever resolution your screen actually is. Then, any element that is bit mapped in the app may not look very crisp, but things like fonts or any element drawn by a UI library can be drawn at the screen's native resolution (because those libraries have been updated to know about the "fake" vs "real" resolution).
This is very similar to when you hit "ctrl +" in a modern web browser. If the web app says "place this element 25 pixels to the right", those are logical pixels and has little to do with actual screen pixels anymore.
So the best thing you can do, other than re-write all the applications that have been around for the last 30 years or more, is to make the app think it is writing to a display with a specific resolution. Then scale that up to whatever resolution your screen actually is. Then, any element that is bit mapped in the app may not look very crisp, but things like fonts or any element drawn by a UI library can be drawn at the screen's native resolution (because those libraries have been updated to know about the "fake" vs "real" resolution).
This is very similar to when you hit "ctrl +" in a modern web browser. If the web app says "place this element 25 pixels to the right", those are logical pixels and has little to do with actual screen pixels anymore.