gpt4 book ai didi

windows - 如何区分空窗口文本和 GetWindowText API 错误?

转载 作者:可可西里 更新时间:2023-11-01 13:11:41 25 4
gpt4 key购买 nike

GetWindowText 函数的返回值为 documented as follows :

If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero. To get extended error information, call GetLastError.

现在,当调用此方法并收到零返回值时,我如何知道 GetLastError 是否会返回一个合理的值?毕竟,零不仅用于指示失败,还可能意味着窗口文本为空,在这种情况下 GetLastError 不会返回未定义的值。

我自己的想法:

  • 起初,我认为 GetWindowText 可能会在成功时将最后一个错误设置为 0。但测试表明它没有(如果有,我也不能依赖它,因为没有记录)。
  • 然后,我认为 GetWindowText 可能会在成功时保持最后一个错误不变,因此在调用之前将其设置为 0 可以让我检查最后一个错误是否已更改。测试表明这可能有效,但由于没有以这种方式证明,所以我不能依赖它。 (我想这在很大程度上取决于具体情况和 GetWindowText 的实现。)
  • 当然,我可以先使用 GetWindowTextLength 检查窗口文本长度,然后仅当长度大于 0 时才调用 GetWindowText。但是,如果窗口在调用 GetWindowTextLengthGetWindowText 之间更改其文本?同样,我不能依赖零返回值来表示错误。

那么,我该怎么做才能确定 GetWindowText 是否失败?

最佳答案

SetLastError(ERROR_SUCCESS) 预先是完全安全和受支持的。

最后错误代码的文档清楚地表明函数在成功时可能会也可能不会清除最后错误值。但是,可以肯定的是,如果一个函数成功,它要么保持最后一个错误值不变,要么将其设置为零,但永远不会将其更改为错误值。

WinAPI函数的实现规则可以概括为:

  1. 如果没有发生错误,不要调用 SetLastError
  2. 如果辅助函数设置了一个不会导致 API 失败的错误代码,请调用 SetLastError(0),这样调用者就看不到非致命内部错误,or call RestoreLastError and pass whatever GetLastError returned on entry to your API
  3. 如果您的 API 在没有抛出 SEH 异常的情况下失败,请调用 SetLastError 来报告它(除非辅助函数已经这样做了)。

记录的行为“某些函数在成功时调用 SetLastError 并返回零”是第 2 点的结果。

关于windows - 如何区分空窗口文本和 GetWindowText API 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com