Pergunta

Eu estou tentando usar o seguinte para obter a altura e largura da tela principal:

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

No entanto, ele está falhando em um erro de link externos não resolvidos (LNK1120). Eu tentei ligar para User32.lib (como documentado aqui ), e recebeu o mesmo erro, bem como links para wmbase.lib (como documentado aqui ), e recebeu o erro que wmbase.lib não existe! O que estou fazendo de errado?

Note que eu só estou usando plain-ol' C - não C ++. Não é a função certa para começar a usar a resolução de tela (em pixels) da tela principal?

Eu estou tentando compilar isso em MSVC no momento, mas prefere uma solução portátil para outros compiladores.

Graças.

Editar

Portanto, parece que os parâmetros que eu estava procurando eram SM_CXSCREEN e SM_CYSCREEN, não SM_CXBORDER e SM_CYBORDER. No entanto, eu ainda não consegue chegar a este compilar.

Aqui está o erro real se isso esclarece qualquer coisa (quando ligado a 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

(Eu estou tentando compilar um módulo Python / C é por isso que você vê os diretórios estranhas)

Foi útil?

Solução

Você quer #include <windows.h> vez de <winuser.h>. Como está, é provavelmente obter algum dos modificadores na errado protótipo como ela é.

Edit: já que você ainda está tendo problemas, talvez possamos começar com um teste simplificado e ver o que você recebe. Felizmente, GetSystemMetrics() não precisa de um identificador de janela ou qualquer coisa assim e pode chamá-lo a partir de um aplicativo de console simples:

#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;
}

Aqui está uma cópia do ecrã de compilar e executar o seguinte:

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

Se isto não compilar e executar, você provavelmente tem um problema com sua instalação. Se isso acontecer, então o problema é provavelmente em algum lugar do projeto que você está trabalhando.

Outras dicas

Isto não ajuda com o seu erro de link, no entanto você também questão de saber se esse é o caminho certo para obter o tamanho de exibição. Os parâmetros que você está passando para GetSystemMetrics não retornará o que você quer. Verifique as bandeiras disponíveis no documentação . Considere também usando SystemParametersInfo . Que chamada para uso depende do contexto do que exatamente você está tentando encontrar -. Tamanho do monitor vs workarea, etc

A solução é ou definir COMPILE_MULTIMON_STUBS em um de seus módulos.

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top