我有功能
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;并准确地称其为
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;但是,当我再次检查下一段代码时
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返回真,甚至在它被精确设置为假之前的步骤中。
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是真的。
你有什么想法吗?
提前谢谢你,博扬
发布于 2012-12-30 04:32:41
主要的问题是,当传递SPI_SETDISABLEOVERLAPPEDCONTENT时,您应该传递一个BOOL变量,但是您传递的是一个指向BOOL的指针。documentation说:
pvParam参数是一个BOOL变量。将pvParam设置为TRUE以禁用重叠内容,或将FALSE设置为FALSE以启用重叠内容。
这意味着设置该属性的代码需要如下所示:
SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, Pointer(CAA), 0)你的GetOSVersion简直是个灾难。抱歉,听起来很刺耳!对于Windows8和更高版本,它返回0。并且您的代码存在运算符优先级问题。您可以这样写:
if not GetOSVersion >= 60 then和运算符优先级意味着它被解释为
if (not GetOSVersion) >= 60 then由于GetOSVersion返回一个带符号的值,因此无论windows版本如何,(not GetOSVersion) >= 60的计算结果都是False。这是因为not GetOSVersion总是<= 0。
你想要逻辑否定而不是逐位否定。所以你应该写
if not (GetOSVersion >= 60) then或等同于
if GetOSVersion < 60 then实际上,有一个内置的函数可以做到这一点。它被称为CheckWin32Version。这样叫它:
if not CheckWin32Version(6, 0) then
exit;不过,函数的其余部分有点混乱。通过值传递ErrorText,然后赋值给它。您可能打算让调用者接收该值。这是不会发生的,除非你路过var。
就我个人而言,我会这样写你的过程:
procedure bgSetDisableOverlappedContent(CAA: BOOL);
begin
if CheckWin32Version(6, 0) then
if not SystemParametersInfo(SPI_SETDISABLEOVERLAPPEDCONTENT, 0, Pointer(CAA), 0) then
RaiseLastOSError;
end;我认为最好将SystemParametersInfo中的错误转换为异常,因为这是一个异常情况。我敢打赌,您不会真的生成对SystemParametersInfo调用的失败。在这种情况下,为根本不会发生的事情构建错误代码返回机制是没有意义的。检查错误并转换为运行时异常。这使得调用代码变得非常简单。
您的按钮单击处理程序可以简单得多:
procedure TForm1.Button3Click(Sender: TObject);
begin
bgSetDisableOverlappedContent(False);
end;而且getter函数也比必要的复杂得多。我会这样做:
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;https://stackoverflow.com/questions/14085508
复制相似问题