【问题标题】:C# Setting cursor position - different results with WinForms and WPFC# 设置光标位置 - WinForms 和 WPF 的不同结果
【发布时间】:2017-09-18 20:55:16
【问题描述】:

我有一个奇怪的问题。我正在尝试使用 WPF 设置光标位置。到目前为止,一切都很好。问题如下:

在我的电脑屏幕(1920x1080,100% 窗口缩放)上一切正常,但在我的 Surface 笔记本电脑(3000x2000,200% 窗口缩放)上,我遇到了一些问题。由于缩放因子,“新分辨率”为 1500x1000(因为 200% 每个像素都是“两倍大”)。

当我使用 WinForms 将光标设置为 750、500 时,光标出现在屏幕的正中间,但是当我使用 WPF 将光标位置设置为同一点时,光标出现在左上角。

显然WinForms在设置光标位置时使用1500x1000分辨率,WPF使用3000x2000分辨率...

为什么他们在这里使用不同的分辨率?这对我来说没有意义。因为当我用

阅读 ScreenWidth 和 Height
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width // and Height, WinForms

System.Windows.SystemParameters.PrimaryScreenWidth // and Heigth,  WPF

两者都显示 1500x1000。

谁能帮帮我?也许这只是 WPF/WinForms 的区别?

设置光标的代码:

Cursor.Position = p; // with imported System.Windows.Forms;

// or (tryed both)

[DllImport("User32.dll")]
private static extern bool SetCursorPos(int X, int Y);
SetCursorPos(p.X, p.Y);

第一次发帖,请不要杀了我!

【问题讨论】:

  • 尝试在启动时调用[DllImport("user32.dll")]private static extern bool SetProcessDPIAware();,看看是否能解决您的问题。
  • 明确地说,您在 WPF 和 WinForms 应用程序中使用相同的 SetCursorPos 方法,并使用相同的参数值调用它,但您看到的结果不同?

标签: c# wpf winforms


【解决方案1】:

我不是这个主题的专家,但也许:

WPF 使用矢量图形来渲染事物,并且原生支持缩放。如果您将 Windows 中的字体大小更改为200%,则每个WPF 应用程序都会变大2x

但是在WinForms 中,如果您没有正确编写应用程序,缩放可能会毁掉您的UI

为避免这种情况,如果您运行 WinForms 应用程序(在 Windows 10 中),它将仅使用 100% 字体大小,并将渲染图像拉伸到 200% 大小。因此,您可以看到例如模糊的文本。如果图像被拉伸 - 屏幕坐标也必须被拉伸。

但这只是我的猜测,我不是这方面的专家。

【讨论】:

  • 听起来似乎是因为SetCursorPos 似乎在 OP 的 WinForms 应用程序中应用了逻辑像素,但在 WPF 应用程序中应用了设备像素:可能有一个兼容层为 WinForms 应用程序提供更改的显示指标。
  • 我猜这是“问题”。我也尝试调用 SetProcessDPIAware() 函数,但它不起作用。所以我想我必须为正确的屏幕坐标找到一种解决方法或另一种计算方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多