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したがって、とにかく、結果を格納する場所を確保するには、actual を使用する必要があります。

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;

ポインターを理解せずに型と API 呼び出しを使用しようとしたため、あなたは C# の人だと思います。LPRECTへのポインタであると言う派生型RECTです。この型の変数があると、無効なメモリ アドレスへのポインターを宣言したことになります (ポインター変数は初期化されていません)。あなたのコードはアプリをクラッシュさせるでしょう。

代わりに変数を保持し、RECT変数へのポインターを渡して、API によって初期化/ファイル化する必要があります。

于 2012-06-01T13:36:48.690 に答える