您的位置:首页 > 其它

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

2013-03-15 11:44 423 查看
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的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: