首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPI_SETDISABLEOVERLAPPEDCONTENT

SPI_SETDISABLEOVERLAPPEDCONTENT
EN

Stack Overflow用户
提问于 2012-12-30 04:12:46
回答 1查看 208关注 0票数 1

我有功能

代码语言:javascript
复制
function bgSetDisableOverlappedContent(CAA: BOOL; var ErrorCode: DWORD; ErrorText: string): Boolean;  
begin
  errorCode := ERROR_SUCCESS;
  ErrorText := '';  
  if not GetOSVersion >= 60 then
    Exit;
  Result := SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, @CAA, 0);
  if not Result then
  begin
    ErrorCode := GetLastError;
    ErrorText := GetErrorText(ErrorCode);
  end;
end;

并准确地称其为

代码语言:javascript
复制
procedure TForm1.Button3Click(Sender: TObject);
var
  CAA: BOOL;
  OS: TUsableInOS;
  ErrorCode: DWORD;
  ErrorText: string;
begin
  CAA := False;
  if bgSetDisableOverlappedContent(CAA, ErrorCode, ErrorText) then
    ShowMessage('Success');
end;

但是,当我再次检查下一段代码时

代码语言:javascript
复制
function bgGetDisableOverlappedContent(var CAA: BOOL; OS: TUsableInOS; ErrorCode: DWORD; ErrorText: string): Boolean;
begin
  errorCode := ERROR_SUCCESS;
  ErrorText := '';
  os := tosVistaUp;   
  if not GetOSVersion >= 60 then
    Exit;   
  Result := SystemParametersInfo(SPI_GETDISABLEOVERLAPPEDCONTENT, 0, @CAA, 0);   
  if not Result then
  begin
    ErrorCode := GetLastError;
    ErrorText := GetErrorText(ErrorCode);
  end;
end;
function GetOSVersion: Integer;
var
  OSVersionInfo : TOSVersionInfo;
begin
  Result:= 0;
  FillChar(OsVersionInfo, Sizeof(OsVersionInfo), 0);
  OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
  if GetVersionEx(OSVersionInfo) then
  begin
    if OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
    begin
      if (OsVersionInfo.dwMajorVersion = 5) and ((OsVersionInfo.dwMinorVersion = 0)) then
         Result:= 50; //2000
      if (OsVersionInfo.dwMajorVersion = 5) and ((OsVersionInfo.dwMinorVersion = 1)) then
         Result:= 51; //XP
      if (OsVersionInfo.dwMajorVersion = 5) and ((OsVersionInfo.dwMinorVersion = 2)) then
         Result:= 52; //2003, 2003 R2
      if (OsVersionInfo.dwMajorVersion = 6) and ((OsVersionInfo.dwMinorVersion = 0)) then
         Result:= 60; //Vista, Windows Server 2008
      if (OsVersionInfo.dwMajorVersion = 6) and ((OsVersionInfo.dwMinorVersion = 1)) then
         Result:= 61; //Server 2008 R2, 7
    end;
  end;
end;

我正在处理Win 7。和Result of result SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT,:= 0,@ CAA,0);是真,但是SPI_GETDISABLEOVERLAPPEDCONTENT为CAA返回真,甚至在它被精确设置为假之前的步骤中。

代码语言:javascript
复制
procedure TForm1.Button3Click(Sender: TObject);
var
  CAA: BOOL;
  OS: TUsableInOS;
  ErrorCode: DWORD;
  ErrorText: string;
  Res: Bool;
begin
  CAA := False;
{  if bgSetDisableOverlappedContent(CAA, ErrorCode, ErrorText) then
    ShowMessage('Success'); }
  Res := SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT,
                                 0,
                                 @CAA,
                                 0);

  Res := SystemParametersInfo(SPI_GETDISABLEOVERLAPPEDCONTENT,
                                 0,
                                 @CAA,
                                 0);
  if Caa then
    ShowMessage('True')
  else
    ShowMessage('False');
end;

CAA是真的。

你有什么想法吗?

提前谢谢你,博扬

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-30 04:32:41

主要的问题是,当传递SPI_SETDISABLEOVERLAPPEDCONTENT时,您应该传递一个BOOL变量,但是您传递的是一个指向BOOL的指针。documentation说:

pvParam参数是一个BOOL变量。将pvParam设置为TRUE以禁用重叠内容,或将FALSE设置为FALSE以启用重叠内容。

这意味着设置该属性的代码需要如下所示:

代码语言:javascript
复制
SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, Pointer(CAA), 0)

你的GetOSVersion简直是个灾难。抱歉,听起来很刺耳!对于Windows8和更高版本,它返回0。并且您的代码存在运算符优先级问题。您可以这样写:

代码语言:javascript
复制
if not GetOSVersion >= 60 then

和运算符优先级意味着它被解释为

代码语言:javascript
复制
if (not GetOSVersion) >= 60 then

由于GetOSVersion返回一个带符号的值,因此无论windows版本如何,(not GetOSVersion) >= 60的计算结果都是False。这是因为not GetOSVersion总是<= 0

你想要逻辑否定而不是逐位否定。所以你应该写

代码语言:javascript
复制
if not (GetOSVersion >= 60) then

或等同于

代码语言:javascript
复制
if GetOSVersion < 60 then

实际上,有一个内置的函数可以做到这一点。它被称为CheckWin32Version。这样叫它:

代码语言:javascript
复制
if not CheckWin32Version(6, 0) then
  exit;

不过,函数的其余部分有点混乱。通过值传递ErrorText,然后赋值给它。您可能打算让调用者接收该值。这是不会发生的,除非你路过var

就我个人而言,我会这样写你的过程:

代码语言:javascript
复制
procedure bgSetDisableOverlappedContent(CAA: BOOL);
begin
  if CheckWin32Version(6, 0) then
    if not SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, Pointer(CAA), 0) then
      RaiseLastOSError;
end;

我认为最好将SystemParametersInfo中的错误转换为异常,因为这是一个异常情况。我敢打赌,您不会真的生成对SystemParametersInfo调用的失败。在这种情况下,为根本不会发生的事情构建错误代码返回机制是没有意义的。检查错误并转换为运行时异常。这使得调用代码变得非常简单。

您的按钮单击处理程序可以简单得多:

代码语言:javascript
复制
procedure TForm1.Button3Click(Sender: TObject);
begin
  bgSetDisableOverlappedContent(False);
end;

而且getter函数也比必要的复杂得多。我会这样做:

代码语言:javascript
复制
function bgGetDisableOverlappedContent: Boolean;
var
  CAA: BOOL;
begin
  if not CheckWin32Version(6, 0) then
  begin
    Result := False;//or True, I don't know, you decide
    exit;
  end;
  if not SystemParametersInfo(SPI_GETDISABLEOVERLAPPEDCONTENT, 0, @CAA, 0) then
    RaiseLastOSError;
  Result := CAA;
end;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14085508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档