Как устранить ошибку компоновки для GetSystemMetrics()?

Я пытаюсь использовать следующее, чтобы получить высоту и ширину основного дисплея:

#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_CXSCREEN а также SM_CYSCREENне SM_CXBORDER а также SM_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, поэтому вы видите странные каталоги)

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

Если он не скомпилируется и не запустится, возможно, у вас проблема с установкой. Если это так, то проблема, вероятно, где-то в проекте, над которым вы работаете.

Решение состоит в том, чтобы либо определить COMPILE_MULTIMON_STUBS в одном из ваших модулей.

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>

Это не поможет с ошибкой вашей ссылки, однако вы также задаетесь вопросом, является ли это правильным способом получения размера экрана. Параметры, которые вы передаете в GetSystemMetrics, не будут возвращать то, что вы хотите. Проверьте доступные флаги в документации. Также рассмотрите возможность использования SystemParametersInfo. Какой вызов использовать, зависит от контекста того, что именно вы пытаетесь найти - размер монитора против рабочей области и т. Д.

Другие вопросы по тегам