GetSystemMetrics(SM_CYSCREEN); |给出错误的值|但是 GetSystemMetrics(SM_CXSCREEN);给出正确的值

GetSystemMetrics(SM_CYSCREEN); | Gives wrong value| but GetSystemMetrics(SM_CXSCREEN); gives correct value

我对 GetSystemMetrics(SM_CYSCREEN); 有疑问 – 每次我 运行 程序时,此函数 returns 的高度都是随机的,但宽度函数 GetSystemMetrics(SM_CXSCREEN); 给出了正确的值。

这是我的代码:

#include <windows.h>
#include <tchar.h>  
#include <stdio.h>   

int  MessageBoxPrintf(const wchar_t * szCaption, const wchar_t * szFormat, ...) {

    wchar_t buffer[1024];
    va_list v1;
    va_start(v1, szFormat);
    wchar_t* c = va_arg(v1, wchar_t*);
    wsprintf(buffer, szFormat, c); //gives formated output to buffer
    va_end(v1);
    return MessageBox(NULL, buffer, szCaption, 0);      
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
    int cxScreen, cyScreen;
    cxScreen = GetSystemMetrics(SM_CXSCREEN);  
    cyScreen = GetSystemMetrics(SM_CYSCREEN);
    MessageBoxPrintf(TEXT("ScreenRes"), TEXT("The screen is %i pixels wide by %i pixels high"), cxScreen, cyScreen);
    return 0;
}

这个程序基本上只是一个带有 WinAPI 和 C++ 的格式字符串消息框。

您发布的代码显示(几乎可以肯定)未定义的行为,因为您在 MessageBoxPrintf 函数中处理可变参数列表的方式不正确。

wchar_t* c = va_arg(v1, wchar_t*); 行中,你是 'assuming' 一个单一的 wchar_t 参数——但是,在你的 main 函数中,你传递了 两个int 个参数。这可能会或不会产生有意义的结果; – 在你的情况下,似乎第一个 int 参数被随后对 wsprintf 的调用正确解释,但第二个参数有点“在翻译中丢失”(表现出上述未定义的行为)。

要正确处理可变参数列表,您需要提取它,然后将其 未处理 传递给 vswprintf function,然后它可以正确解释该参数列表:

int MessageBoxPrintf(const wchar_t* szCaption, const wchar_t* szFormat, ...)
{
    wchar_t buffer[1024];
    va_list v1;
    va_start(v1, szFormat);
    vswprintf(buffer, 1024, szFormat, v1);
    va_end(v1);
    return MessageBox(NULL, buffer, szCaption, 0);
}