Cioè 9 non accettando Sendkeys
-
11-12-2019 - |
Domanda
ho pubblicato su IE 9 non accettando Sendkeys aScarica un file , ma questo problema è abbastanza separato dalla risposta che ho ricevuto per giustificare un'altra domanda.Il mio problema è che non riesco a ottenere IE 9 per accettare nessuno dei SendKeys
.Ho tentato pagina Down , scheda , tutti i tasti f # , e nessuno di loro funziona.
Ecco il codice che sto usando:
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
.
Sono a una perdita totale perché sembra che la maggior parte dei forum o tutorial non faccia nulla di diverso per IE 9. L'oggetto IE viene creato in un modulo di classe e inizializzato nel sub Class_Initialize
.Non sono sicuro se questo aiuta qualcuno, ma non ho davvero idea del motivo per cui questo non funziona e qualsiasi aiuto su come inviare chiavi a IE sarebbe molto apprezzato.
Soluzione
Questa è in realtà una copia di La mia risposta a Questa domanda , ma potrebbe ancora applicare.
è la finestra IE attiva quando provi il SendKeys
? In caso contrario, questo lo spiegherebbe non funziona.
Per attivare la finestra:
All'inizio del modulo, inserisci questa linea di codice:
Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long
.
Ciò consentirà di accedere alla funzione SetForegroundWindow
integrata in Windows.
Nel tuo codice, mentre interagire con il tuo oggetto IE, registra l'HWnd per quella finestra come:
Dim HWNDSrc As Long
HWNDSrc = ie.HWND
.
Quindi dopo aver caricato la pagina, usa questo per continuare, quindi inviare le tue azioni chiave:
SetForegroundWindow HWNDSrc
.
Tuttavia, questo potrebbe non essere necessario, a seconda di come si interagisce con IE. In altre parole, se non è necessario vedere / toccare la finestra (si esegue per SendKeys
), è ancora possibile interagire usando l'oggetto nel codice.
.
Ora, vedo l'utilizzo dell'applicazione. Dopo aver fatto clic, ma ciò non garantisce che la pagina IE abbia caricato. Questa funzione dovrebbe aiutarsi con questo.
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
.
.
A rischio di essere lunghi, ho aggiornato il tuo codice con questi suggerimenti ...
' 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
.