Question

Je tente d'utiliser ce qui suit pour obtenir la hauteur et la largeur de l'écran principal:

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

Cependant, il est à défaut sur une erreur de lien externes non résolus (de LNK1120). J'ai essayé un lien vers user32.lib (comme documenté ici ), et a reçu la même erreur, ainsi que des liens vers wmbase.lib (tel que documenté ici ), et a reçu l'erreur wmbase.lib n'existe pas! Qu'est-ce que je fais mal?

Notez que je n'utilise « C plain-ol - pas C ++. Est-ce la bonne fonction à utiliser pour obtenir la résolution de l'écran (en pixels) de l'écran principal?

Je cherche à compiler ce sur MSVC au moment, mais je préfère une solution portable à d'autres compilateurs.

Merci.

Modifier

Il semble donc que les paramètres que je recherchais étaient SM_CXSCREEN et SM_CYSCREEN, pas SM_CXBORDER et SM_CYBORDER. Cependant, je ne peux toujours pas réussi à obtenir ce pour compiler.

Voici l'erreur réelle si cela clarifie quelque chose (lorsqu'elle est liée à 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

(je tente de compiler un module Python / C et c'est pourquoi vous voyez les répertoires étranges)

Était-ce utile?

La solution

Vous voulez #include <windows.h> au lieu de <winuser.h>. Comme-est, il se fait probablement partie des modificateurs sur le prototype faux car il est.

Edit: puisque vous rencontrez toujours des problèmes, nous pouvons peut-être commencer par un test simplifié et voir ce que vous obtenez. Heureusement, GetSystemMetrics() n'a pas besoin d'une poignée de fenêtre ou quoi que ce soit si e peut l'appeler à partir d'une simple application de la console:

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

Voici une copie d'écran de la compilation et l'exécution de ce:

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

Si cela ne compile pas et exécuter, vous avez probablement un problème avec votre installation. Dans le cas contraire, le problème est probablement quelque part dans le projet sur lequel vous travaillez.

Autres conseils

Cela ne contribuera pas à votre erreur de lien, mais vous aussi se demander si c'est la bonne façon d'obtenir la taille d'affichage. Les params vous passer à GetSystemMetrics ne reviendra pas ce que vous voulez. Vérifiez les drapeaux disponibles à la documentation . Pensez également à utiliser SystemParametersInfo . Qui font appel à l'utilisation dépend du contexte de ce que vous essayez de trouver exactement -. La taille du moniteur vs workarea, etc

La solution consiste à définir dans une COMPILE_MULTIMON_STUBS de vos modules.

#define COMPILE_MULTIMON_STUBS
#include <multimon.h>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top