`
风吹过PP好冷
  • 浏览: 38407 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SystemParametersInfo中SPI_GETNONCLIENTMETRICS在XP下用法注意

阅读更多

实际应用中,一段代码在Win7下使用正常,在XP下获取字体异常。

 

 

ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT));
NONCLIENTMETRICS nm;
nm.cbSize = sizeof (NONCLIENTMETRICS);
VERIFY (SystemParametersInfo(SPI_GETNONCLIENTMETRICS,nm.cbSize,&nm,0)); 
m_lf =  nm.lfMenuFont;
m_lf.lfWeight = FW_NORMAL;
m_lf.lfHeight = -12;
m_fontMenu.CreateFontIndirect (&m_lf);
pFont = pDC->SelectObject (&m_fontMenu);
 

 问题出在NONCLIENTMETRICS这个结构体上,头文件中的定义如下

 

 

typedef struct tagNONCLIENTMETRICSW
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTW lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTW lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTW lfMenuFont;
    LOGFONTW lfStatusFont;
    LOGFONTW lfMessageFont;
#if(WINVER >= 0x0600)
    int     iPaddedBorderWidth;
#endif /* WINVER >= 0x0600 */
}   NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, FAR* LPNONCLIENTMETRICSW;

 在Vista及以上的系统中结构体的成员发生了增加,为了确保在XP,Vista,Win7下均能正常,我们需要在targetver.h中或头文件的其他地方定义

 

#ifndef WINVER                          
#define WINVER 0x0500         
#endif
分享到:
评论

相关推荐

    精选_使用SystemParametersInfo函数实现更改计算机桌面背景图片_源码打包

    在这个例子中,`SystemParametersInfo`函数被调用,传入`SPI_SETDESKWALLPAPER`作为`uiAction`,`wallpaperPath`作为`pvParam`,`SPIF_SENDCHANGE`作为`fWinIni`。如果调用成功,系统将立即更新桌面背景,并发送一个...

    SystemParametersInfo_with_Delphi2010.rar

    本篇文章将深入探讨SystemParametersInfo函数在Delphi 2010中的具体使用方法和应用场景。 SystemParametersInfo函数源自Windows API,定义在`User32.dll`库中。其原型为: ```delphi function ...

    Delphi禁止使用系统键、禁止添加桌面快捷方式.rar

    Delphi禁止使用系统键、禁止添加桌面快捷方式,禁止也就是屏蔽掉这些功能,当然也可以重新打开,屏蔽功能的实现,主要是以下代码:  SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, @tmp, 0); //屏蔽 Alt-Tab  ...

    Delphi 7 屏幕保护开关程序代码.rar

    Delphi 7开关屏幕保护... SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);  if not TurnScreenSaverOn then  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0);  end;  完整源码请下载本源码包。

    精彩编程与编程技巧-如何改变桌面的图片?...

    在我们的例子中,使用 `SPI_SETDESKWALLPAPER` 来表示设置桌面壁纸的操作。 - `uParam`: 在当前上下文中通常不使用,可以设为0。 - `lpvParam`: 是一个指向包含新壁纸路径的字符串的指针。 - `fuWinIni`: 控制...

    精彩编程与编程技巧-利用代码启动 关闭中文输入法...

    实现这一功能主要依赖于操作系统提供的API接口,例如在Windows系统中可以使用`SystemParametersInfo`函数。该函数允许应用程序获取和设置系统参数和信息,其中包括与中文输入法相关的设置。 #### 1.3 代码示例解析 ...

    VB取得windows句柄,显示系统字体大小.rar

    在这个示例中,`SPI_GETFONTSMOOTHINGTYPE`可以用来获取字体平滑类型,而`SPI_GETNONCLIENTMETRICS`则可以获取包括系统字体大小在内的非客户区区域的尺寸信息。`NONCLIENTMETRICS`结构体包含了各种界面元素的字体...

    vc win32 win api 防止 屏幕保护 防止显示器自动关闭

    在防止显示器自动关闭时,我们可以使用`SPI_SETSCREENSAVEACTIVE`和`SPI_SETMONITORPOWER`标志来分别控制屏幕保护程序和显示器的电源状态。 在MFC框架下,我们通常会创建一个对话框类(如`CpreventDlg`),并在其中...

    VB编程技巧集(中)--站长推荐

    Call SystemParametersInfo(SPI_SCREENSAVERRUNNING,True,pOld,0) 如想将Ctrl+ALt+Del 的功能还原,只需将True换为False 注意:此方案只适用于Windows 9X,NT不适用 按下Ctrl+Alt+Del后,会调出Windows的结束任务...

    禁用桌面属性

    需要注意的是,这种方法并不是完全禁止用户访问桌面属性,经验丰富的用户仍可能通过其他方式(如命令行工具)改变设置。此外,过于严格的限制可能会对用户体验造成影响,因此在实际应用时,应充分考虑场景和目标,...

    精彩编程与编程技巧-关闭屏幕保护功能,改变屏保等待时间...

    在日常的计算机使用过程中,屏幕保护程序(简称“屏保”)是一个常见的功能。它主要用于防止显示器长时间显示同一画面而导致图像残留或烧屏的问题。此外,对于某些用户来说,屏保还可以作为一种个性化的展示方式。...

    在程序中启动或禁止屏幕保护例程.rar

    要在程序中控制屏幕保护,我们需要使用Windows API。关键的函数包括`SystemParametersInfo`,这是一个用于获取或设置系统参数的通用函数。我们可以使用它的`SPI_GETSCREENSAVETIMEOUT`和`SPI_SETSCREENSAVETIMEOUT`...

    delphi设置系统时间格式

    在Delphi中,我们可以使用`System.Time`类型来表示时间,而`SysUtils`单元提供了一些函数来处理时间格式。例如,`FormatSettings`记录了用户的区域设置,包括时间格式。我们可以用以下代码获取当前系统时间格式: `...

    gh0st源码笔记_详解.

    VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0)); ``` - 参数解释: - `SPI_GETNONCLIENTMETRICS`: 获取非客户区的参数。 - `sizeof(NONCLIENTMETRICS)`: 整个...

    C# .NET 禁止屏幕保护程序

    在.NET框架下,使用C#编程语言可以实现对操作系统功能的控制,其中之一就是禁止屏幕保护程序的启动。本文将深入探讨如何通过C#代码来阻止屏幕保护程序的运行,以及涉及的相关知识点。 首先,理解屏幕保护程序的工作...

    精彩编程与编程技巧-改变墙纸...

    在IT领域,特别是编程技术中,能够通过代码实现桌面壁纸的自动更换,无疑是一种既实用又炫酷的技能。从给定的文件标题、描述、标签以及部分内容来看,本文将深入探讨如何使用Visual Basic(以下简称VB)编程语言,...

    API取任务栏屏幕用户区高度等

    在本场景中,我们关注的是获取任务栏屏幕用户区高度的功能,这涉及到一个特定的API函数——`SystemParametersInfo`。这个函数允许应用程序获取或设置系统参数,包括窗口边框的宽度、颜色、鼠标光标的形状,以及任务...

    VC取得任务栏高度的方法

    SystemParametersInfo(SPI_GETWORKAREA, 0, &rt, 0); //任务栏在下面的高度 int y = ::GetSystemMetrics(SM_CYSCREEN)-rt.Height(); //上面 y = rt.top; //左 y = rt.left; //右 y = ::GetSystemMetrics(SM_CXSCREEN...

    如何启动屏幕保护程序

    请注意,实际开发中,你需要根据你的项目需求和所使用的编程语言,适当地调整和封装这些API调用。同时,启动屏幕保护程序需要相应的权限,确保你的程序有足够的权限执行此类操作。 总结来说,启动屏幕保护程序既...

Global site tag (gtag.js) - Google Analytics