The Windows C/C++ API returns a structure with version numbers [1], same with the C# one [2]. Other languages just wrap the native C API call, GetVersionEx.
The most troubled framework is Java: because of some strange design decision, you can only get the version as a string (see [3]), and that makes impressively easy for programmers to screw up version checks. However, as other commenters have said, those apps could run on compatibility mode and Windows would solve the issue itself instead of completely changing an operating system's name.
1: http://msdn.microsoft.com/en-us/library/windows/desktop/ms72... 2: http://msdn.microsoft.com/en-us/library/system.environment.o... 3: http://stackoverflow.com/questions/228477/how-do-i-programma...