gpt4 book ai didi

winapi - GetDoubleClickTime 意外返回 0

转载 作者:行者123 更新时间:2023-12-04 00:54:41 24 4
gpt4 key购买 nike

在某些客户将其 Windows 10 安装升级到 2004 版(2020 年 5 月更新)后,我们发现我们的软件存在问题。
Web 服务应用程序中的服务器端代码创建了一个 DevExpress PDF 查看器控件,但失败并显示错误消息“间隔不能为 0”。 (我知道在 Web 服务中创建可视化控件不是一个好主意,但这是遗留代码,更改起来并不容易)。
分析显示问题在于控件试图创建一个.net WinForms Timer组件并设置其 Interval SystemInformation.DoubleClickTime 的结果的属性(这只是 GetDoubleClickTime winapi 函数的包装器)。发生错误是因为 DoubleClickTime值意外为 0。
为什么会发生这种情况,是否有一些解决方法?

最佳答案

Windows API 函数“GetDoubleClickTime”用于查询两次鼠标单击之间的最大毫秒数,以便将两次单击计为一次双击。
Windows 10 版本 2004 在批量登录的上下文中执行时,此函数意外返回 0,这意味着例如:

  • Windows 服务中的代码
  • 从 Windows 服务启动的应用程序中的代码
  • IIS 中 Web 应用程序中的服务器端代码
  • 应用程序中的代码从 Windows 中的“计划任务”开始
    设置“无论用户是否登录都运行”

  • 在所有这些情况下,都没有用户界面。已执行的代码(在我的例子中是非常旧的遗留代码,用户界面和业务规则之间还没有分离)仍然可以查询值,如果意外返回 0,则失败。例如,在我的情况下,第三方用户界面控件被实例化,当尝试根据系统双击时间设置 .net Windows 窗体计时器时失败。
    在更新到版本 2004 之前,相同的场景在 Windows 10 中返回值 > 0。
    如何重现错误
    使用以下简单的 C# 应用程序
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    namespace WindowsFormsApp14
    {

    static class Program
    {
    [DllImport("user32.dll")]
    static extern uint GetDoubleClickTime();

    [STAThread]
    static void Main()
    {
    // Same result with var doubleClickTime =
    // System.Windows.Forms.SystemInformation.DoubleClickTime;
    var doubleClickTime = GetDoubleClickTime();

    Trace.WriteLine("DoubleClickTime: " + doubleClickTime);
    }
    }
    }
    使用 Microsoft 工具 DebugView (启用设置“Capture Global Win32”)以查看 Trace.WriteLine 的输出。
    然后在 Windows 任务计划程序中创建一个任务来执行编译的应用程序。使用设置“无论用户是否登录都运行”。你会看到输出是

    DoubleClickTime: 0


    如果直接执行编译的应用程序,你会看到正确的输出

    DoubleClickTime: 500


    (或其他一些取决于您的鼠标设置的值)。
    在以前的 Windows 10 版本中,这两种情况都返回了大于 0 的值。
    当代码在 Windows 服务或 IIS 应用程序池中的 Web 应用程序中运行时,可以看到相同的效果。也可能在其他情况下,每当代码在批处理登录的上下文中运行时。
    如何解决问题
  • 等待 Microsoft 在 future 的更新中修复该问题。
  • 如有必要,建议客户不要安装 Windows 10 2004 更新或返回到之前的 Windows 10 版本
  • 修补您的代码并确保它可以处理 GetDoubleClickTime 返回 0 的情况。如有必要,请联系第三方库的供应商修补他们的库。

  • 引用
    我也将此作为博客文章发布:
  • Bug in Windows 10 Version 2004: GetDoubleClickTime unexpectedly returns 0 when Batch Login is used

  • DevExpress 正在为其 PDF 查看器组件发布补丁:
  • A PdfViewer instance cannot be created if the SystemInformation.DoubleClickTime environment variable returns 0
  • 关于winapi - GetDoubleClickTime 意外返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63466907/

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