为啥他们在 GetWindowRect 函数中使用它

Posted

技术标签:

【中文标题】为啥他们在 GetWindowRect 函数中使用它【英文标题】:why they use this in GetWindowRect function为什么他们在 GetWindowRect 函数中使用它 【发布时间】:2021-01-23 09:44:39 【问题描述】:
        // Get the size of the window to capture
        Rectangle rect = new Rectangle();
        GetWindowRect(handle, ref rect);

        // GetWindowRect returns Top/Left and Bottom/Right, so fix it
        rect.Width = rect.Width - rect.X;
        rect.Height = rect.Height - rect.Y;

我的英语不是很好,但我对 C# 编码很感兴趣,如果我发布了一个愚蠢的问题,请见谅。 无论如何,我读到了GetWindowRect(handle, ref rect);,我知道这个函数会将句柄的Top/LeftBottom/Right 返回到“rect”。但是为什么这段代码需要通过

来解决问题
    rect.Width = rect.Width - rect.X;
    
    rect.Height = rect.Height - rect.Y;

有什么意义? GetWindowRect 不是已经返回左上角和右上角的位置了吗?

他们为什么要修复它?

【问题讨论】:

只是一个糟糕的 [DllImport] 声明,使用 Rectangle 而不是 RECT。所以他们不得不在之后修复几何。 我可以说他们很懒吗? 【参考方案1】:

在您的代码库中定义 Rectangle 结构的人没有遵循 C 头文件中结构上的名称。 RECT 结构有 topleftbottomright 成员,它们保存矩形的屏幕坐标。

您的代码通过抓取坐标然后将bottomright 成员重新映射为高度和宽度来“作弊”。

【讨论】:

非常感谢你,肖恩!是否与“根据 RECT 结构的约定,返回的矩形的右下角坐标是排他的。换句话说,(右,下)处的像素位于矩形之外。” 哦,我明白了。再次感谢肖恩。在我读了你的帖子2-3次之后。我解决了我的好奇心。这对我来说意义重大。因为你我更聪明了谢谢xD @Sean - Whoever defined the Rectangle structure in your codebase - 讽刺?还是一样的 Midrosoft:docs.microsoft.com/en-us/dotnet/api/… :)【参考方案2】:

我不清楚你在问什么,但是 可以找到API信息here

你会发现GetWindowRect 只返回boolean 而不是RECT

但是,它写入第二个参数以设置RECT 结构。

在他们最终修改从GetWindowrect()获得的rect的值之后。

【讨论】:

我明白了,非常感谢。

以上是关于为啥他们在 GetWindowRect 函数中使用它的主要内容,如果未能解决你的问题,请参考以下文章

各位高手,小弟请教关于GetWindowRect,GetClientRect以及ClientToScreen,ScreenToClient的使用!先谢谢啦

WinApi中的GetClientRect和GetWindowRect有啥区别?

为啥门控激活函数(在 Wavenet 中使用)比 ReLU 工作得更好?

GetWindowRect 在一个应用程序上返回错误值,所有其他应用程序都是正确的

Windows 7 上的 GetWindowRect 太小

C++ MFC - 在 CDialog::OnSize 事件 (GetWindowRect) 上没有引发运行时错误的代码执行失败