SystemParametersInfo (SPI_GETNONCLIENTMETRICS ... 返回false的原因分析

SystemParametersInfo (SPI_GETNONCLIENTMETRICS ... 返回false的原因分析
VC2008下有这么一段代码
NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(ncm);
VERIFY(SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))
运行时报错, 原因是SystemParametersInfo返回false引起的. 


看下面NONCLIENTMETRICS的定义
typedef struct tagNONCLIENTMETRICS
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONT lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONT lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONT lfMenuFont;
    LOGFONT lfStatusFont;
    LOGFONT lfMessageFont;
#if(WINVER >= 0x0600)
    int     iPaddedBorderWidth;
#endif /* WINVER >= 0x0600 */
}   NONCLIENTMETRICS, *PNONCLIENTMETRICS, FAR* LPNONCLIENTMETRICS;


修改如下SystemParametersInfo则返回true:
NONCLIENTMETRICS ncm;
memset(&ncm, 0, sizeof(NONCLIENTMETRICS));
#if(WINVER >= 0x0600)
ncm.cbSize = sizeof(NONCLIENTMETRICS) - sizeof(ncm.iPaddedBorderWidth);
#else
ncm.cbSize = sizeof(NONCLIENTMETRICS);
#endif /* WINVER >= 0x0600 */
VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));    

原因分析:
在SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);中拷贝内存的大小无论WINVER是什么版本, 都是不包含iPaddedBorderWidth的.

你可能感兴趣的:(SystemParametersInfo (SPI_GETNONCLIENTMETRICS ... 返回false的原因分析)