Вопрос

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

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

Это было полезно?

Решение

Вы хотите #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

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

Другие советы

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

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

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top