5

它应该可以正常工作:

#include <iostream>
#define _WIN32_WINNT 0x501
#include <windows.h>

using namespace std;

int main() {
  HWND consoleWindow = GetConsoleWindow();
  LPRECT lpRect;
  GetWindowRect(consoleWindow,lpRect);
  cout << lpRect.top <<endl;
}

但相反,我得到了这个:

error: request for member 'top' in 'lpRect', which is of non-class type 'LPRECT {aka tagRECT*}'
4

3 回答 3

6

你的代码是错误的。Windows 在这里需要一个有效的 Rect。LPRECT 只是一个指针,你还没有初始化它。请像这样修改它。

HWND consoleWindow = GetConsoleWindow();
RECT aRect;
GetWindowRect(consoleWindow,&aRect);
cout << aRect.top <<endl;
于 2012-06-01T13:36:53.427 回答
4

LPRECT类型是指向的指针RECT。这(不幸的是,在我看来)在 Win32 API 中很常见,它们会在你身上“隐藏星号”。由于星号在 C 语言中很重要,因此会造成更多混乱。

所以,无论如何,你需要使用一个实际RECT的地方来存储结果:

RECT rect; /* An actual RECT, with space for holding a rectangle. */

/* The type of &rect is LPRECT. */
GetWindowRect(consoleWindow, &rect);
于 2012-06-01T13:36:24.160 回答
0

你要:

RECT Rect;
GetWindowRect(consoleWindow, &Rect);
cout << Rect.top <<endl;

我会说你是一个 C# 人,因为你试图在不理解指针的情况下使用类型和 API 调用。LPRECT是派生类型,表示它是指向RECT. 拥有这种类型的变量,您声明了一个指向无效内存地址的指针(指针变量未初始化)。您的代码预计会使应用程序崩溃。

您需要改为保存一个RECT变量,并将一个指针传递给它以使其由 API 初始化/归档。

于 2012-06-01T13:36:48.690 回答