解释 GetKeyState / GetCursorPos 的错误

2023-11-24

有时我会收到客户的错误报告,但我无法解释。在 Delphi 中的 Application.Run() 之后,我收到以下错误:

 EOSError: System error: Code:_5 Access denied

 Call Stack Information:
-------------------------------------------------------------------
|Address |Module     |Unit       |Class |Procedure       |Line    |
-------------------------------------------------------------------
|Running Thread: ID=4352; Priorität=0; Klasse=; [Main Thread]     |
|-----------------------------------------------------------------|
|772B291F|USER32.dll |           |      |GetKeyState     |        |
|772B7B96|USER32.dll |           |      |GetPropA        |        |
|772B7B5A|USER32.dll |           |      |GetPropA        |        |
|772A7BC5|USER32.dll |           |      |DispatchMessageA|        |
|772A7BBB|USER32.dll |           |      |DispatchMessageA|        |
|00A6D804|Program.exe|Program.dpr|      |                |803[369]|  // Application.Run
-------------------------------------------------------------------

and

EOsError: A call to an OS function failed

Call Stack Information:
-------------------------------------------------------------------
|Address |Module     |Unit       |Class |Procedure       |Line    |
-------------------------------------------------------------------
|Running Thread: ID=2712; Priorität=0; Klasse=; [Main Thread]     |
|-----------------------------------------------------------------|
|7E379758|USER32.dll |           |      |GetCursorPos    |        |
|7E379ED9|USER32.dll |           |      |GetKeyState     |        |
|7E37B3FC|USER32.dll |           |      |CallNextHookEx  |        |
|7E380078|USER32.dll |           |      |GetPropA        |        |
|7E380042|USER32.dll |           |      |GetPropA        |        |
|7E3696C2|USER32.dll |           |      |DispatchMessageA|        |
|7E3696B8|USER32.dll |           |      |DispatchMessageA|        |
|00A6E823|Program.exe|Program.dpr|      |                |803[369]|  //Application.Run
-------------------------------------------------------------------

在这两种情况下,从 Eurekalog 提交的屏幕截图都是全黑的。

谁能解释一下,什么会导致 GetCursorPos 或 GetKeyState 以这种方式失败?


的文档GetCursorPos says:

调用GetCursorPos时输入的桌面必须是当前桌面。调用OpenInputDesktop判断当前桌面是否为输入桌面。如果不是,请使用 OpenInputDesktop 返回的 HDESK 调用 SetThreadDesktop 以切换到该桌面。

您可能会遇到这种情况,最常见的是在解锁工作站时。在我的代码中我替换GetCursorPos有了这个变体:

function GetCursorPos(var lpPoint: TPoint): BOOL; stdcall;
(* The GetCursorPos API in user32 fails if it is passed a memory address >2GB 
   which breaks LARGEADDRESSAWARE apps.  We counter this by calling GetCursorInfo
   instead which does not suffer from the same problem.

   In addition we have had problems with GetCursorPos failing when called 
   immediately after a password protected screensaver or a locked workstation 
   re-authenticates. This problem initially appeared with XP SP1 and is brought 
   about because TMouse.GetCursorPos checks the return value of the GetCursorPos 
   API call and raises an OS exception if the API has failed.
*)
var
  CursorInfo: TCursorInfo;
begin
  CursorInfo.cbSize := SizeOf(CursorInfo);
  Result := GetCursorInfo(CursorInfo);
  if Result then begin
    lpPoint := CursorInfo.ptScreenPos;
  end else begin
    lpPoint := Point(0, 0);
  end;
end;

您可以使用您喜欢的代码挂钩机制来替换GetCursorPos。我这样做是这样的:

RedirectProcedure(@Windows.GetCursorPos, @CodePatcher.GetCursorPos);

with RedirectProcedure如此处所述:delphi 中的补丁例程调用

事实证明,对于我的特定场景,GetCursorPos会失败,但是GetCursorInfo不会失败。但正如评论中指出的,有些情况下GetCursorInfo也会失败。在这种情况下,您可能会发现安排修补后的函数不返回是很方便的False.

As for GetKeyState,我对此不太确定。很可能很相似,但是GetKeyState是一个我个人并不熟悉的API。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释 GetKeyState / GetCursorPos 的错误 的相关文章

随机推荐

  • 如何在 mysql REGEXP 中转义方括号?

    我将视频嵌入代码存储在数据库表中 我们使用多种视频源 包括 YouTube Viddler 和本地存储的 Flash 文件 我需要找到所有带有 flash 文件的记录 Flash 记录的正文字段如下所示 swf file sites def
  • Fusion Log Viewer 的替代品?

    除了 Fuslogvw exe 之外 是否还有其他 Fusion 日志查看器程序 或者将 Fusion 日志输出定向到您自己的目录 然后手动检查大量 HTM 文件 我的两个主要抱怨是 我想要一个概述 显示哪些程序集加载成功 哪些失败 我不确
  • 当时仅打开一扇平开窗

    我开发了一个 Swing 应用程序 但每次运行应用程序时都会打开新窗口 我希望如果一个窗口已打开 则其他窗口不允许打开 Here是一个例子Java单个应用程序实例 单实例应用程序是一种无论用户尝试启动多少次都只允许运行 1 个应用程序的应用
  • event.preventDefault() 函数在 IE 中不起作用

    以下是我的 JavaScript mootools 代码 orderNowForm addEvent submit function event event preventDefault allFilled false required e
  • 如何通过 Eclipse 插件使用 Java 11 (Java 10)?

    如果我在 Eclipse 插件中指定 JavaSE 10 作为最低执行环境 当我的插件作为 Eclipse 应用程序启动时 出现以下错误 org osgi framework BundleException Could not resolv
  • 先有鸡还是先有蛋的问题:文件的哈希值(包括文件内的哈希值)!可能的?

    问题是我有一个有元数据空间的文件 我想在其中存储用于完整性验证的哈希值 问题是 一旦我存储了哈希值 文件和哈希值就会随之改变 我完全理解 根据定义 使用 md5 sha 等单向加密哈希方法是不可能的 我还意识到容器可以像 zip co 那样
  • UseShellExecute=false 时无法提升权限

    我想启动一个具有提升权限但具有隐藏窗口的子进程 实际上是相同的控制台应用程序 我接下来做 var info new ProcessStartInfo Assembly GetEntryAssembly Location UseShellEx
  • 如何从文件中读取特定格式的数据?

    我应该从类似于此格式的文件中读取输入和参数 Add id 324 name john name2 doe num1 2009 num2 5 num2 20 问题是我不允许使用 fgets 我尝试使用 fscanf 但不知道如何忽略 并分隔字
  • 无法调用“事件”命令:应用程序已被破坏

    因此 我今天正在调试一些代码 并注意到输出中出现一条新消息 can t invoke event command application has been destroyed while executing event generate w
  • 键盘辞职降低了弹出窗口的高度

    我在 ios 4 3 上遇到了一个奇怪的问题 我的一个屏幕处于横向模式 单击按钮会出现一个弹出窗口 我的弹出窗口有一个搜索栏 每当键盘出现时 它会自动将我的弹出窗口向上推 当我退出键盘时 弹出窗口的高度减小 这只是 ios 4 3 上的问题
  • C++ 类中的函数指针表

    我正在尝试在类中创建一个函数指针表 我在网上找不到任何这样的例子 大多数都涉及在类之外使用成员函数指针 例如 class Test typedef void Test FunctionType FunctionType table 0x10
  • 我可以覆盖 inline !important 吗?

    如果你有 div style display none important div 有没有办法覆盖样式表中的样式以使其显示 最好使用与此类似的东西 div display block important 首先我要说的是一般是内联样式can被
  • std::string 运算符 + 与 stringstream 的性能[重复]

    这个问题在这里已经有答案了 我正在将旧的代码库从使用字符串的自定义实现迁移到使用 std string 我们的一位工程师担心这可能会导致性能问题 因为我们使用 和 来连接相对较长的字符串 他特别关心的是当字符串动态增长时如何分配内存 他建议
  • 背景图片有理想的尺寸吗?

    例如 1x1 图像加载速度会比 2x2 图像加载速度更快吗 尺寸会更小 但浏览器的工作量必须是原来的两倍 对吧 那么 背景图像是否有理想的尺寸和形状 正方形与矩形 我知道这可能不太重要 但我有兴趣知道 谢谢 我认为您的图像没有 理想 尺寸
  • Telerik 控件布局问题 - Visual Studio 2013

    我最近在我的计算机上安装了 Visual Studio 2013 和 2012 我们有几个使用 Telerik 控件的 Web 应用程序 ASP NET 和 MVC 今天 我注意到手风琴控件 扩展器 已完全展开 其中的内容一个又一个地堆叠在
  • [] 和 {} 与 list() 和 dict() 相比,哪个更好? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我知道它们本质上是同一件事 但就风格而言 哪一个用于创建空列表或字典更好 更Pythonic 就速度而言 它与空列表 字典没有竞争 gt gt gt from timeit import
  • Python BigQueryallowLargeResults 与 pandas.io.gbq

    我想使用用于读取 BigQuery 的 Pandas 库数据 如何允许较大的结果 对于非 Pandas BigQuery 交互 可以这样实现this Pandas 的当前代码 sProjectID project id sQuery SEL
  • 使用 ASP.Net 实现多语言网站

    我正在使用 ASP Net 实现一个多语言网站 语言为英语 法语和阿拉伯语 请注意 阿拉伯语的方向是 RTL 实施多语言支持的最佳方式是什么 我计划使用 Net 本地化功能 但网站文本存储在数据库中 对于控件 表单控件 我可以使用 resx
  • 跟踪栏仅在最终值上触发事件,而不会在时间值发生变化时触发事件

    我正在开发一个非常基本的 C Visual Studio 表单应用程序 但在让轨迹栏按照我想要的方式运行时遇到一些问题 因此希望社区中的某个人可以为此提供解决方案 我所拥有的是一个非常基本的应用程序 主要部分是一个值为 0 到 100 的轨
  • 解释 GetKeyState / GetCursorPos 的错误

    有时我会收到客户的错误报告 但我无法解释 在 Delphi 中的 Application Run 之后 我收到以下错误 EOSError System error Code 5 Access denied Call Stack Inform