我张贴在 IE9不接受SendKeys下载文件, ,但这个问题与我收到的答案足够分开,可以证明另一个问题是合理的。我的问题是我无法让IE9接受任何 SendKeys.我曾尝试过 向下翻页, 标签, ,所有的 F# 钥匙,而且都不起作用。

这是我正在使用的代码:

Dim ie As Object

'This creates the IE object
Sub initializeIE()
   'call this subprocedure to start internet explorer up
   Set ie = CreateObject("internetexplorer.application")
   pos = 1
End Sub

'Initialize the class object
Private Sub Class_Initialize()
   initializeIE
End Sub

Function followLinkByText(thetext As String) As Boolean
  'clicks the first link that has the specified text
  Dim alink As Variant

  'Loops through every anchor in html document until specified text is found
  ' then clicks the link
  For Each alink In ie.document.Links
     If alink.innerHTML = thetext Then
          alink.Click
          'waitForLoad
          Application.Wait Now + TimeValue("00:00:01")
          Application.SendKeys "{PGDN}", True
          Application.SendKeys "{PGUP}", True
          'I've also tried calling it without Application before it
          SendKeys "{F1}", True
          SendKeys "{F2}", True
          'Etc... Each of these not being received by IE 9

          followLinkByText = True
          Exit Function
      End If
  Next

End Function

我完全不知所措,因为看起来大多数论坛或教程都没有为IE9做任何不同的事情。IE对象在类模块中创建,并在 Class_Initialize 子。我不确定这是否有帮助,但我真的不知道为什么这不起作用,并且对于如何将密钥发送到IE的任何帮助将不胜感激。

有帮助吗?

解决方案

这实际上是一个副本 我的回答这个问题, ,但它可能仍然适用。

当您尝试您的 SendKeys?如果没有,这将解释它不起作用。

激活窗口:

在你的模块的开头,把这行代码:

Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long

这将允许您访问 SetForegroundWindow 功能内置于Windows。

在你的代码中,在与你的IE对象交互时,像这样记录该窗口的HWND:

Dim HWNDSrc As Long
HWNDSrc = ie.HWND

然后在加载页面后,使用此继续,然后发送您的关键操作:

SetForegroundWindow HWNDSrc

但是,这可能不是必需的,具体取决于您与IE的交互方式。换句话说,如果你不需要看/触摸窗口(你做 SendKeys),您仍然可以在代码中使用对象进行交互。


现在,我看到你使用应用程序。点击后等待,但这并不能保证IE页面已加载。这个功能应该有助于这一点。

 Public Sub WaitForIE(myIEwindow As InternetExplorer, HWND As Long, WaitTime As Integer)

    ' Add pauses/waits so that window action can actually
    ' begin AND finish before trying to read from myIEWindow.

    ' myIEWindow is the IE object currently in use
    ' HWND is the HWND for myIEWindow
    ' The above two variables are both used for redundancy/failsafe purposes.
    ' WaitTime is the amount of time (in seconds) to wait at each step below. 
    ' This is variablized because some pages are known to take longer than 
    ' others to load, and some pages with frames may be partially loaded,
    ' which can incorrectly return an READYSTATE_COMPLETE status, etc.

    Dim OpenIETitle As SHDocVw.InternetExplorer

    Application.Wait DateAdd("s", WaitTime, Now())

    Do Until myIEwindow.ReadyState = READYSTATE_COMPLETE
        ' Wait until IE is done loading page and/or user actions are done.
    Loop

    Application.Wait DateAdd("s", WaitTime, Now())

    While myIEwindow.Busy
        DoEvents  ' Wait until IE is done loading page and/or user actions are done.
    Wend

    On Error Resume Next
    ' Make sure our window still exists and was not closed for some reason...
    For Each OpenIETitle In objShellWindows
        If OpenIETitle.HWND = HWND Then
            If Err.Number = 0 Then
                Set myIEwindow = OpenIETitle
                Exit For
            Else
                Err.Clear
            End If
        End If
    Next OpenIETitle
    On Error GoTo 0

End Sub

冒着啰嗦的风险,我已经用这些建议更新了您的代码。..

' Added by Gaffi
Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long
Dim HWNDSrc As Long

Dim ie As Object


'This creates the IE object
Sub initializeIE()
   'call this subprocedure to start internet explorer up
   Set ie = CreateObject("internetexplorer.application")

' Added by Gaffi
   HWNDSrc = ie.HWND

   pos = 1
End Sub

'Initialize the class object
Private Sub Class_Initialize()
   initializeIE
End Sub

Function followLinkByText(thetext As String) As Boolean
  'clicks the first link that has the specified text
  Dim alink As Variant

  'Loops through every anchor in html document until specified text is found
  ' then clicks the link
  For Each alink In ie.document.Links
     If alink.innerHTML = thetext Then
          alink.Click
          'waitForLoad

' Added by Gaffi
          WaitForIE ie, HWNDSrc, 1
          SetForegroundWindow HWNDSrc

          'Application.Wait Now + TimeValue("00:00:01")
          Application.SendKeys "{PGDN}", True
          Application.SendKeys "{PGUP}", True
          'I've also tried calling it without Application before it
          SendKeys "{F1}", True
          SendKeys "{F2}", True
          'Etc... Each of these not being received by IE 9

          followLinkByText = True
          Exit Function
      End If
  Next

End Function
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top