我正试图通过它的把手来获得窗户的位置。然后,我想在窗口0、0的位置绘制一个十字,就像这样(记事本在显示器的左上角附近):
但是如果我将记事本移到右下角附近,它看起来像这样:
这对我来说很奇怪。 我记录了rect.Left和rect.Top的值,并将它们与Spy ++的值进行比较,它们是相同的。
我尝试过的方法: 来自user32.dll:
GetWindowRect(handle, out var rect);
来自dwmapi.dll:
DwmGetWindowAttribute(handle, DWMWINDOWATTRIBUTE.ExtendedFrameBounds, out var rect, size);
效果更好一些,但是仍然是相同的行为。
有人知道一种方法,可以在窗口所在的位置独立找到窗口0、0?
答案 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中。之后,我将窗体的边界设置为屏幕边界,仅此而已。现在,它完全可以按预期运行了。