如何解决 GetSystemMetrics() 的链接错误?
-
18-09-2019 - |
题
我尝试使用以下方法来获取主显示屏的高度和宽度:
#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
如果无法编译和运行,则您的安装可能存在问题。如果确实如此,那么问题可能出在您正在处理的项目中的某个地方。
不隶属于 StackOverflow