标签: getsystemmetrics

GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果

在.NET 4.0 - > .NET 4.5应用程序迁移过程中,我发现了一种非常奇怪的行为.我已经能够将这个问题跟踪到这个简短的代码片段:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用Target Framework = 4.0(以及2.0,3.0,3.5)编译时,它输出8x8

编译时Target Framework = 4.5,输出4x4

使用MSVS2012调试器运行此示例也始终输出4x4(使用任何目标框架).

其他选项(目标框架配置文件,目标平台,启用/禁用Aero)不会影响结果,唯一改变输出的是目标框架和运行调试器.我已经能够在3台计算机上重现这个问题,不幸的是它们在安装的软件方面几乎完全相同:

  • Windows 7 Ultmate SP1(俄语,所有更新安装)与MSVS2012(英语/ rusian)更新1
  • Windows 8(在虚拟机上)

目前我正在考虑修补一些使用反射SystemParameters调用的.NET类(例如)GetSystemMetrics(),但我不确定如何获得正确的度量值.

问题:

  • 我错过了什么吗?如何GetSystemMetrics() …

c# .net-4.0 getsystemmetrics .net-4.5

6
推荐指数
2
解决办法
7057
查看次数

GetSystemMetrics和TScreen返回错误的值

我正在使用Delphi XE5.我想我的笔记本电脑有问题.过了一会儿,它会向Screen.Width和GetSystemMetrics(SM_CXSCREEN)返回错误的值(高度相同).我的操作系统是Windows 7 64位.

我的笔记本电脑的屏幕分辨率是1920x1080(1080p),但我的应用程序说它是1280x720(720p).我不认为有一个DPI问题,因为当我重新启动并在一段时间后启动时问题就出现了.兼容性设置也关闭.以前有人有这个问题吗?或者您知道解决方案吗?我还在下面添加了清单但没有帮助

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <asmv3:windowsSettings
         xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>
Run Code Online (Sandbox Code Playgroud)

这是我如何编译它

1 24 "mf.txt"
Run Code Online (Sandbox Code Playgroud)

编辑:

好吧,我写了这个功能,这是修复它的棘手方法.我更喜欢Screen.Width返回正确的值:

function ScreenSize(var x, y: integer): boolean;
const
  ENUM_CURRENT_SETTINGS =  -1;
  ENUM_REGISTRY_SETTINGS = -2;
var
  dm: TDevMode;
begin
  Result := False;
  x := 0;
  y := 0;
  ZeroMemory(@dm, sizeof(dm));
  if EnumDisplaySettings(nil, Cardinal(ENUM_CURRENT_SETTINGS), dm) then
  begin
    Result := True;
    x := dm.dmPelsWidth;
    y := dm.dmPelsHeight;
  end else
  begin
    x := GetSystemMetrics(SM_CXSCREEN);
    y := GetSystemMetrics(SM_CYSCREEN);
  end;
end; …
Run Code Online (Sandbox Code Playgroud)

delphi resolution getsystemmetrics

3
推荐指数
1
解决办法
1159
查看次数

在excel vba中查找外部显示器的大小

要查找显示器的大小,我一直在使用:

Declare Function GetSystemMetrics32 Lib "user32" Alias "GetSystemMetrics" (ByVal Index As Long) As Long
Run Code Online (Sandbox Code Playgroud)

然后:

Function getMonitorSize()
  monitorHeight = GetSystemMetrics32(1)
  monitorWidth = GetSystemMetrics32(0)
End Function
Run Code Online (Sandbox Code Playgroud)

这适用于主显示器,但如何找到外接显示器的大小?

api excel vba getsystemmetrics

2
推荐指数
1
解决办法
2850
查看次数

标签 统计

getsystemmetrics ×3

.net-4.0 ×1

.net-4.5 ×1

api ×1

c# ×1

delphi ×1

excel ×1

resolution ×1

vba ×1