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

来源:互联网 发布:sql替换字符串 编辑:程序博客网 时间:2024/05/29 12:23

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);#elsencm.cbSize = sizeof(NONCLIENTMETRICS);#endif /* WINVER >= 0x0600 */VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));    

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

原创粉丝点击