2

メインディスプレイの高さと幅を取得するために、次を使用しようとしています。

#include <winuser.h>
size_t width = (size_t)GetSystemMetrics(SM_CXBORDER);
size_t height = (size_t)GetSystemMetrics(SM_CYBORDER);

ただし、未解決の外部リンクエラー(LNK1120)では失敗します。user32.lib(ここに記載されている)にリンクしようとしましたが、同じエラーとwmbase.lib(ここに記載されている)にリンクすると、wmbase.libが存在しないというエラーが表示されました。私は何が間違っているのですか?

私はC++ではなくプレーンオールCのみを使用していることに注意してください。これは、メインディスプレイの画面解像度(ピクセル単位)を取得するために使用するのに適切な関数ですか?

現在、これをMSVCでコンパイルしようとしていますが、他のコンパイラに移植可能なソリューションをお勧めします。

ありがとう。

編集

したがって、私が探していたパラメータはSM_CXSCREENandであり、andでSM_CYSCREENはないように見えます。しかし、私はまだこれをコンパイルすることができません。SM_CXBORDERSM_CYBORDER

それが何かを明らかにした場合の実際のエラーは次のとおりです(user32.libにリンクされている場合):

screen.obj : error LNK2019: unresolved external symbol __imp__GetSystemMetrics@4 referenced in function _getMainDisplaySize
build\lib.win32-2.6\foomodule\bitmap.pyd : fatal error LNK1120: 1 unresolved externals
error: command '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\link.exe"' failed with exit status 1120

(Python / Cモジュールをコンパイルしようとしているので、奇妙なディレクトリが表示されます)

4

3 に答える 3

3

#include <windows.h>の代わりにしたい<winuser.h>。現状では、プロトタイプの修飾子のいくつかがそのまま間違っている可能性があります。

編集: まだ問題があるので、簡単なテストから始めて、何が得られるかを見てみましょう。幸いなことにGetSystemMetrics()、ウィンドウ ハンドルなどは必要ないため、単純なコンソール アプリケーションから呼び出すことができます。

#include <windows.h>
#include <iostream>

int main() { 
    size_t width = (size_t)GetSystemMetrics(SM_CXSCREEN);
    size_t height = (size_t)GetSystemMetrics(SM_CYSCREEN);

    std::cout << "width = " << width << "\n";
    std::cout << "height = " << height << std::endl; 
    return 0;
}

これをコンパイルして実行したときのスクリーン ダンプを次に示します。

D:\C\source>cl screen_res.cpp user32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

screen_res.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:screen_res.exe
screen_res.obj
user32.lib

D:\C\source>screen_res
width = 1600
height = 1200

これがコンパイルおよび実行されない場合は、おそらくインストールに問題があります。もしそうなら、問題はおそらくあなたが取り組んでいるプロジェクトのどこかにあるでしょう。

于 2009-12-10T17:20:34.807 に答える
1

解決策は、いずれかのモジュールで COMPILE_MULTIMON_STUBS を定義することです。

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
于 2016-11-03T10:50:14.733 に答える
0

これはリンク エラーの解決には役立ちませんが、それが表示サイズを取得する正しい方法であるかどうかについても疑問があります。GetSystemMetrics に渡すパラメーターは、必要なものを返しません。ドキュメントで利用可能なフラグを確認してください。SystemParametersInfoの使用も検討してください。どの呼び出しを使用するかは、正確に見つけようとしているもののコンテキストによって異なります-監視サイズと作業領域など。

于 2009-12-10T17:35:51.390 に答える