27/04/12 11:42
pescarese77
Salve a tutti ho un problema vi spiego qual'è e vi posto le mie righe di comando magari la soluzione sara anche banale ma non ancora la trovo, io volevo utilizzare l'evento timer per calcolare il tempo impiegato dalla mia applicazione per svolgere determinate operazioni su una applicazione esterna, ma il timer non parte o se parte si blocca. vi posto il codice che ho fatto.
non so se puo dipendere dalla funzione api SetForegroundWindow, con la quale do il focus all'aplicazione esterna. comunque un pratica devo fare questo nel esempio sopra uso internet explorer su google, ma la stessa cosa può essere fatta su mote altre applicazione, comunque trovo l'handle dell'applicazione esterna tramite l'api FindWindow e poi tramite SetForegroundWindow e l'handle sposto il focus sull'aplicazione dove fare magari operazioni con mouse in maniera automatica, e poi sempre con SetForegroundWindow ri do il focus alla mia applicazione per elaborare ho aggiunto volontariamente anche delle pause tramite l'istruzione System.Threading.Thread.Sleep pensando che dovessi dare tempo all'aplicazione ma niente il mio cronometro non va. cosa sbaglio? devo aggiungere il thred esterno al mio? in modo da usare setfocus? o altro?
Imports System.Runtime.InteropServices Public Class FrmCronometro 'Ipvoke per i vari metodi 'Richiamo funzioni da libreria windows per trovare la finestra attiva <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ Private Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As IntPtr End Function '---------------------------------------------------------------------- 'Funzione per dare lo stato attivo alal finestra che e selezionata con la funzione findwindows <DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _ Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function Dim TestoOra As String = "00" Dim TestoMinuti As String = "00" Dim TestoSecondi As String = "00" Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'Avvio il cronometro Timer1.Start() 'Avvio le operazioni da eseguire prova() 'spengo il cronometro in modo da visualizzare il tempo impiegato tra i 2 programmi Timer1.Stop() End Sub Private Sub prova() Dim i As Integer = 1 Do 'trovo l'handle dell'applicazione da cercare Dim HandleRoulette = FindWindow(vbNullString, "Google - Windows Internet Explorer") 'Do il focus all'aplicazione esterna SetForegroundWindow(HandleRoulette) 'Metto un timer per dare il tempo per utilizzare la finestra System.Threading.Thread.Sleep(1000) 'Rimetto la mia finestra in focus per aggiornare la mia applicazione SetForegroundWindow(Me.Handle) 'do del tempo prima di ripetere l'operazione System.Threading.Thread.Sleep(1000) i += 1 Loop Until i = 3 End Sub Private Sub FrmCronometro_Load(sender As Object, e As System.EventArgs) Handles Me.Load Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi End Sub Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick TestoSecondi = TestoSecondi + 1 If TestoSecondi < 10 Then TestoSecondi = "0" & TestoSecondi End If If TestoSecondi = 60 Then TestoSecondi = "00" TestoMinuti = TestoMinuti + 1 If TestoMinuti < 10 Then TestoMinuti = "0" & TestoMinuti End If If TestoMinuti = 60 Then TestoMinuti = "00" TestoOra = TestoOra + 1 If TestoOra < 10 Then TestoOra = "0" & TestoOra End If End If End If Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi End Sub End Class
non so se puo dipendere dalla funzione api SetForegroundWindow, con la quale do il focus all'aplicazione esterna. comunque un pratica devo fare questo nel esempio sopra uso internet explorer su google, ma la stessa cosa può essere fatta su mote altre applicazione, comunque trovo l'handle dell'applicazione esterna tramite l'api FindWindow e poi tramite SetForegroundWindow e l'handle sposto il focus sull'aplicazione dove fare magari operazioni con mouse in maniera automatica, e poi sempre con SetForegroundWindow ri do il focus alla mia applicazione per elaborare ho aggiunto volontariamente anche delle pause tramite l'istruzione System.Threading.Thread.Sleep pensando che dovessi dare tempo all'aplicazione ma niente il mio cronometro non va. cosa sbaglio? devo aggiungere il thred esterno al mio? in modo da usare setfocus? o altro?
aaa