Frage

Ich habe am gepostet IE 9 akzeptiert SendKeys nicht zum Herunterladen einer Datei, aber dieses Problem ist weit genug von der Antwort entfernt, die ich erhalten habe, um eine weitere Frage zu rechtfertigen.Mein Problem ist, dass ich IE 9 nicht dazu bringen kann, irgendetwas davon zu akzeptieren SendKeys.Ich habe es versucht Bild nach unten, Tab, alle der F# Schlüssel, und keiner von ihnen funktioniert.

Hier ist der Code, den ich verwende:

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

Ich bin völlig ratlos, weil es den Anschein hat, als würden die meisten Foren oder Tutorials für IE 9 nichts anderes bewirken.Das IE-Objekt wird in einem Klassenmodul erstellt und im initialisiert Class_Initialize sub.Ich bin mir nicht sicher, ob das hilft, aber ich habe wirklich keine Ahnung, warum das nicht funktioniert, und wäre für jede Hilfe, wie man Schlüssel an den IE sendet, sehr dankbar.

War es hilfreich?

Lösung

Dies ist tatsächlich eine Kopie von meine Antwort Zu diese Frage, aber es kann immer noch zutreffen.

Ist das IE-Fenster aktiv, wenn Sie es versuchen? SendKeys?Wenn nicht, würde dies erklären, dass es nicht funktioniert.

So aktivieren Sie Ihr Fenster:

Fügen Sie am Anfang Ihres Moduls diese Codezeile ein:

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

Dadurch erhalten Sie Zugriff auf SetForegroundWindow In Windows integrierte Funktion.

Zeichnen Sie in Ihrem Code während der Interaktion mit Ihrem IE-Objekt den HWND für dieses Fenster wie folgt auf:

Dim HWNDSrc As Long
HWNDSrc = ie.HWND

Nachdem Sie die Seite geladen haben, können Sie hiermit fortfahren und dann Ihre wichtigsten Aktionen senden:

SetForegroundWindow HWNDSrc

Dies ist jedoch möglicherweise nicht erforderlich, je nachdem, wie Sie mit dem IE interagieren.Mit anderen Worten: Wenn Sie das Fenster nicht sehen/berühren müssen (Sie müssen es nicht sehen/berühren). SendKeys), können Sie weiterhin mit dem Objekt im Code interagieren.


Jetzt sehe ich, dass Sie Application.Wait verwenden, nachdem Sie geklickt haben, aber das garantiert nicht, dass die IE-Seite geladen wurde.Diese Funktion soll dabei helfen.

 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

Auf die Gefahr hin, zu langatmig zu werden, habe ich Ihren Code mit diesen Vorschlägen aktualisiert ...

' 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top