GetSystemMetrics () devuelve resultados diferentes para .NET 4.5 y .NET 4.0
Durante un proceso de migración de aplicaciones .NET 4.0 -> .NET 4.5, he descubierto un comportamiento extremadamente extraño. He podido rastrear este problema hasta este breve fragmento de código:
class Program
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int GetSystemMetrics(int nIndex);
static void Main(string[] args)
{
const int CXFRAME = 0x20;
const int CYFRAME = 0x21;
var dx = GetSystemMetrics(CXFRAME);
var dy = GetSystemMetrics(CYFRAME);
Console.WriteLine("{0}x{1}", dx, dy);
Console.ReadKey();
}
}
Cuando se compila conTarget Framework = 4.0
(y también 2.0, 3.0, 3.5), da salida8x8
Cuando se compila conTarget Framework = 4.5
, da salida4x4
La ejecución de este ejemplo con el depurador MSVS2012 también produce siempre4x4
(conalguna marco de destino).
Otras opciones (perfil del marco de destino, plataforma de destino, habilitación / deshabilitación de Aero) no afectan el resultado, las únicas cosas que cambian el resultado son el marco de destino y se ejecutan con el depurador. He podido reproducir este problema en 3 computadoras, desafortunadamente son casi idénticas en términos de software instalado:
Windows 7 Ultmate SP1 (ruso, todas las actualizaciones instaladas) con MSVS2012 (inglés / rusian) Actualización 1Windows 8 (en máquina virtual)Actualmente estoy pensando en parchar algunas clases de .NET (SystemParameters
por ejemplo), que llamanGetSystemMetrics()
utilizando la reflexión, pero no estoy seguro de cómo obtener los valores métricos correctos.
Preguntas:
¿Me estoy perdiendo de algo? Como puedeGetSystemMetrics()
ser afectado por el marco de destino?¿Hay alguna manera de llamarGetSystemMetrics()
¿Desde la aplicación .NET 4.5 y obtienes resultados correctos?Estoy abierto a cualquier sugerencia para solucionar este problema. Además, si no puede reproducir el problema, deje una breve descripción del sistema en los comentarios.