gpt4 book ai didi

delphi - 调用 TMouse.GetCursorPos 有时会失败,并显示 "A call to an OS function failed"

转载 作者:行者123 更新时间:2023-12-03 14:58:07 26 4
gpt4 key购买 nike

有时我的应用程序会出现以下错误。

通常,当用户离开办公 table 而我的程序处于打开状态时,就会发生这种情况。当他们回来时,出现了这个错误。

TMouse.GetCursorPostion 除了对 GetCursorPosition 进行 Windows API 调用之外不执行任何操作。然后检查返回值,如果失败则调用 GetLastError。

“对操作系统函数的调用失败”对于追踪此问题的原因没有多大帮助。屏幕保护程序或 sleep 模式是否会导致此错误?我可以修改组件以捕获并忽略错误,但如果可能的话,我宁愿知道它首先发生的是什么/为什么发生。

我的应用程序使用的是 Delphi 2007,并且调用是由 Quasidata 从 Transfer@Once (v 1.7) 组件进行的。

这是调用堆栈:

operating system  : Windows XP Service Pack 3 build 2600exception number  : 1exception class   : EOSErrorexception message : A call to an OS function failed.main thread ($d34):0045e208 UaarSales.exe SysUtils       RaiseLastOSError0045e191 UaarSales.exe SysUtils       RaiseLastOSError0045e237 UaarSales.exe SysUtils       Win32Check004c6de9 UaarSales.exe Controls       TMouse.GetCursorPos00736d8b UaarSales.exe taoCntrr  3999 TtaoHoverTimer.Timer004a1d27 UaarSales.exe ExtCtrls       TTimer.WndProc0047a7a0 UaarSales.exe Classes        StdWndProc7e4196c2 USER32.dll                   DispatchMessageA004da230 UaarSales.exe Forms          TApplication.ProcessMessage004da26a UaarSales.exe Forms          TApplication.HandleMessage004da55f UaarSales.exe Forms          TApplication.Run00b3ea76 UaarSales.exe UaarSales  117 initialization

这是定时器程序


procedure TtaoHoverTimer.Timer;
var
lPos: TPoint;
begin
lPos := Mouse.CursorPos; <b> // this is line 3999 </b>
if (lPos.X = FMousePos.X) and (lPos.Y = FMousePos.Y) and
not ((lPos.X = FOutdatedPos.X) and (lPos.Y = FOutdatedPos.Y)) then
begin
inherited Timer;
FOutdatedPos := Point(MaxInt, MaxInt);
end;
Enabled := False;
end;

最佳答案

CursorPos 使用 Windows GetCursorPos 方法。关于MSDN的备注说它有两个要求:

  • “调用进程必须具有对窗口站的 WINSTA_READATTRIBUTES 访问权限。”
  • “调用GetCursorPos时,输入桌面必须是当前桌面。调用OpenInputDesktop判断当前桌面是否是输入桌面。如果不是,则使用OpenInputDesktop返回的HDESK调用SetThreadDesktop切换到该桌面。”

因此,屏幕保护程序很可能正在另一个桌面上运行。或者,如果您使用的是 Vista,我很确定密码对话框(用于解锁计算机)也可以在另一个桌面上运行。

由于您拥有该组件的源代码,因此您可能需要为 CursorPos 编写自己的包装器,以便在出现问题时返回一个虚拟值。 (编辑:或者评论者建议处理无法获取内联位置的问题,而不是编写函数来返回虚拟值。)

最后,您可以在抛出异常后调用 GetLastError 来查看最后一个 Windows 错误是什么。这应该可以确定它遇到的实际问题是什么。 正如评论中一样(谢谢!),您已经在异常消息中遇到了错误消息。

关于delphi - 调用 TMouse.GetCursorPos 有时会失败,并显示 "A call to an OS function failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/983738/

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