0

我正在尝试自动化在特定对话框中输入数据然后提交对话框的过程,并且数据输入部分工作正常,但是当自动输入数据时,Accept 按钮不会像在手动输入期间那样最终启用。

因此,我尝试以多种方式启用该按钮,但它不会激活。

对话框的图片

我曾尝试使用 EnableWindow 或使用 SendMessage 发送 WM_ENABLED 消息,但都没有奏效。

这是获取按钮句柄并尝试删除禁用样式的代码(使用 P/INVOKE 的 VB.NET)。我已经使用 Spy++ 验证了以下方法删除了 WS_DISABLED 样式,但该按钮仍显示为禁用。

Private Shared Sub ProceedWithRebuild(ByVal mWindow As IntPtr)
    Dim proceedButton As IntPtr
    Dim style As Long

    proceedButton = FindWindowEx(mWindow, IntPtr.Zero, Nothing, "&Proceed")

    style = GetWindowLong(proceedButton, WindowLongFlags.GWL_STYLE)

    style = style And (Not WS_DISABLED)

    SetWindowLong(proceedButton, WindowLongFlags.GWL_STYLE, CType(style, IntPtr))

    UpdateWindow(mWindow)

    SendMessage(proceedButton, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero)
    SendMessage(proceedButton, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero)

    Thread.Sleep(500)
End Sub
4

2 回答 2

2

更新 UI 状态的一种非常常见的方法是在应用程序空闲并从消息队列中检索到最后一条消息时执行此操作。这是 MFC 程序的工作方式,例如 CWinThread::OnIdle() 方法。它的好处是 UI 将始终反映程序状态,而不会在周围显式启用或禁用按钮的代码。实际上,这实际上是一个 MFC 程序的可能性很高,它看起来像一个带有状态栏的程序。

这当然是您方法的克星。您可以尝试破解该按钮的启用状态,但它不会有任何效果。UI 状态代码将立即再次禁用它。即使您确实设法启用它,程序本身仍然没有处于实际处理按钮单击的正确状态。

你无能为力,只能慢一点。实际上像人类一样更新这些控件,以便程序认为它已准备好继续并启用按钮本身。使用 UI 自动化库来减轻这种痛苦。

于 2013-05-01T09:22:27.213 回答
1

在您致电后尝试此代码FindWindowEx()

if (proceedButton != NULL)
    EnableWindow(proceedButton, TRUE);
于 2013-05-01T06:17:01.723 回答