Ciao ragazzi ho necessità di agire su un applicazione secondaria, usando il sendkey.
In rete, cercando un po, ho visto che il metodo più usato è quello delle API di windows quindi (pur non capendo molto bene come fungano) sto usando questo codice:
codice:
Option Strict On
Option Explicit On
Option Infer On
Imports System.Runtime.InteropServices
Public Class frm_automazione
Private Declare Auto Sub mouse_event Lib "user32" (ByVal dwFlags As Int32, ByVal dx As Int32, ByVal dy As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As IntPtr)
Private Const MOUSEEVENTF_LEFTDOWN As Int32 = &H2
Private Const MOUSEEVENTF_LEFTUP As Int32 = &H4
<StructLayout(LayoutKind.Sequential)>
Private Structure RECT
Public Left As Integer
Public Top As Integer
Public Right As Integer
Public Bottom As Integer
End Structure
<DllImport("user32.dll")>
Private Shared Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, EntryPoint:="FindWindow")>
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
End Function
<DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Private Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
Sub autoIns()
Dim hWnd As IntPtr = FindWindow(Nothing, "nome_della_finestra")
If hWnd.Equals(IntPtr.Zero) Then
MessageBox.Show("Window Not Found!", "Aborting", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return
Else
SetForegroundWindow(hWnd)
Dim r As New RECT
GetWindowRect(hWnd, r)
End Sub
End Class
Per impostare la posizione del mouse nel punto corretto uso:
codice:
Cursor.Position = New Point(pos_X, pos_Y)
per fare click col mouse:
codice:
mouse_event(MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero)
e per inviare stringhe alle textbox:
codice:
SendKeys.Send("miaStr")
Detto questo ho 2 problemi che non riesco a risolvere.
Il primo (che dipende dalla mia incompetenza in materia) è che quando uso FindWindow(Nothing, "nome_della_finestra") non riesco a intercettare la finestra bersaglio qualsiasi nome metta (è una finestra di firefox che esegue un applet java).
Per ora ho risolto mettendo me.text dopo aver ridotto a icona il form della mia app (che lancia il codice di interazione) ma è limitante perchè se ho finestre di altre app aperte sotto ovviamente intercetta quelle.
Esiste un modo per aver la lista di finestre aperte in modo da poter vedere il nome esatto della finestra di mio interesse e poterlo inserire? (spero di essermi spiegata bene e ribadisco che non ho ben chiaro cosa stia facendo non avendo mai usato questi metodi).
Il secondo non so bene da cosa dipenda ma quando io creo un ciclo di inserimento (quindi faccio un loop sempre uguale) magari dopo 10/11 (valore casuale) cicli il 12° lo sbaglia... com'è possibile?
Ho pensato possa essere un problema di "timeout" nella risposta dell'app bersaglio e sto provando a inserire dei Threading.Thread.Sleep(200) tra un'operazione e l'altra ma non mi sembra stia funzionando...ogni tanto canna l'inserimento...(e da li ovviamente a cascata va tutto a schifio
)
E' un problema un po particolare spero qualcuno possa aiutarmi!
grazie a tutti!