如果窗口位于右下角附近,则GetWindowRect返回错误的值

时间:2019-05-22 14:35:28

标签: c# winapi

我正试图通过它的把手来获得窗户的位置。然后,我想在窗口0、0的位置绘制一个十字,就像这样(记事本在显示器的左上角附近):

how it should look

但是如果我将记事本移到右下角附近,它看起来像这样:

enter image description here

这对我来说很奇怪。 我记录了rect.Left和rect.Top的值,并将它们与Spy ++的值进行比较,它们是相同的。

我尝试过的方法: 来自user32.dll:

GetWindowRect(handle, out var rect);

来自dwmapi.dll:

DwmGetWindowAttribute(handle, DWMWINDOWATTRIBUTE.ExtendedFrameBounds, out var rect, size);

效果更好一些,但是仍然是相同的行为。

有人知道一种方法,可以在窗口所在的位置独立找到窗口0、0?

2 个答案:

答案 0 :(得分:0)

Direct3D使用世界坐标系,GetWindowRect获取屏幕坐标。那是问题。

使用另一种方法绘制线条,例如Graphics类:

Graphics g;
g = this.CreateGraphics();
Pen myPen = new Pen(Color.Red);
myPen.Width = 1;
g.DrawLine(myPen, point1x, point1y, point2x, point2y);

此外,无论出现什么问题,链接中的代码行:

SetWindowLong(this.Handle, GWL_EXSTYLE,(IntPtr)(GetWindowLong(this.Handle, GWL_EXSTYLE) ^ WS_EX_LAYERED ^ WS_EX_TRANSPARENT));

如果要添加样式,则应该:

SetWindowLong(this.Handle, GWL_EXSTYLE,(IntPtr)(GetWindowLong(this.Handle, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT));

答案 1 :(得分:0)

最后我自己找到了问题。我不得不将FormWindowState设置为Normal,将FormBorderStyle设置为None,但不是在设计器中,而是在顶部的方法InitDevice中。之后,我将窗体的边界设置为屏幕边界,仅此而已。现在,它完全可以按预期运行了。