Oppure

Loading
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.

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
27/04/12 18:45
Ultimo
Postato originariamente da 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.

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
       
    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
        Timer1.Stop()
    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?


Nel codice ti ho spostato il timer1.stop()

Dovresti aver settato a 1000 la propietà tick del timer1.
If ok Then GOTO Avanza else GOTO Inizia

27/04/12 19:34
pescarese77
Salve grazie per la risposta ma il problema non è stato risolto, il codice lo scritto in vb.net 2010 e mi scuso se non lo segnalato prima, ho modificato secondo il tuo schema ma rimane a zero non si muove il cronometro. si nel timer è impostato a 1000 millisecondi, ma nulla le 2 finestre ovviamente come da comando passano a loro volta in primo piano e hanno il focus ma nella finetra del mio programma il conteggio del tempo non avviene. se invece non uso la funzione SetForegroundWindow per dare il fuoco alal finestra esterna in questo esempio fatto da me e Internet Explorer mentre si trova su google, ma potrebbe essere qualsiasi altra finestra, in quanto questo metodo lo devo applicare ad un bot per il texas holdem che mi sono costruito, in pratica metto a fuoco la finestra della aplicazione del gioco la copio negli appunti ritaglio l'iimagine la elaboro ed riesco ad ottenere le carte in mio possesso e man mano le carte scoperte dal banco. unico neo del programma funziona tutto ma volevo un cronometro per far visualizzare nella finestra il tempo trascorso affianco al nome della finestra del mio programma la ciosa si dovrebbe fare con 1 timer il problema e che finche do il focus con SetForegroundWindow sembra non funzionare mentre se metto a fuoco con il mouse o tramite un comando o se lo faccio a mano il contatore funziona( da dire che essendo che il programam dovrebbe giocare da solo l'opzione sarebeb il mouse in automatico facendogli svolgere un click in modo automatico sulla finestra esterna in quando so in che coordinate si trova grazie ad un'altra api di windows, ma vorrei risolvere tutto con la funzione SetForegroundWindow, mi chiedevo ho letto di un'altra funzione che non so se fa al mio caso sarebbe AttachThreadInput con il quale si possono attaccare i therd ma non so se fa al mio caso.
Comunque spostando il timer come da te proposto non succede nulla il timer rimane fermo.
aaa
27/04/12 21:24
Ultimo
               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 Ora As int16 = 0
        Dim Minuti As in16 = 0
        Dim Secondi As int16 = 0
       
        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
           
        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
            Timer1.Stop()
        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
            Secondi = Secondi + 1
            If Secondi < 10 Then
                TestoSecondi = "0" & Secondi
              else
                 TestoSecondi = Secondi
            End If
            If Secondi = 60 Then
                Secondi = 0
                Minuti = Minuti + 1
                If Minuti < 10 Then
                    TestoMinuti = "0" & Minuti
                   else
                    TestoMinuti =  Minuti
                End If
                If Minuti = 60 Then
                    Minuti = 0
                    Ora = Ora + 1
                    If Ora < 10 Then
                        TestoOra = "0" & Ora
                       else
                        TestoOra =  Ora
                    End If
                End If
            End If
            Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
        End Sub
    End Class



Guarda adesso
Ultima modifica effettuata da Ultimo 28/04/12 9:28
If ok Then GOTO Avanza else GOTO Inizia

27/04/12 21:58
pescarese77
no ho aggiunto le 3 variabili che hai proposto e cambiato le condizioni in timer ma niente rimane sempre tutto a zero e non parte se invece levo la funzione SetForegroundWindow andava bene anche come avevo fatto io all'inizio. questo mi fa pensare che probabilmete si deve aggire in modo differente, soltanto non so come ovviare in quando da codice l'unico modo per dare focus ad una finestra di un programamma esterno che io ho trovato e solo tramite la funzione SetForegroundWindow, e non so se c'e ne sia un'altra migliore per fare la stessa cosa ripeto la finestra la devo mettere in focus quindi attiva perche poi mi serve per catturarla come immagine quindi ho già realizzato la simulazione della pressione dei tasti e va tutto bene ho fatto ques'esempio più breve per semplificare la cosa e trovare la soluzione infondo trovato soluzione per questo esempio la cosa si sposa anche nella mia situazione reale. tu che ne pensi conosci qualche altra funzione utile di qualche api per impostare una finestra attiva( per finestra intendo la windows form di un programma esterno che non si riferisce all'applicativo che ho lanciato, come nel mio esempio ho usato Windows Internet Explorer nella funzione FindWindow per trovare tramite la ex proprieta caption cioe il titolo della finestra handle della finestra in modo tale da attivarla tramite SetForegroundWindow.
a questo punto ripeto non so se esiste una funzione simile ma diversa per fare focus. perche sospetto che sia questa funzione a dar problemi.
tu che mi suggerisci?
aaa
28/04/12 9:35
Ultimo
Bisogna attendere il grande Totem ;)

Comunque nel codice precedente ho fatto una correzione, ho aggiunto gli

else.
Ultima modifica effettuata da Ultimo 28/04/12 10:09
If ok Then GOTO Avanza else GOTO Inizia

28/04/12 11:19
pescarese77
gli else non li avevo visti, avevo visto solo l'aggiunta delel variabili comunque provato il codice da te proposto lo copiato per essere sicuro ma niente non va rimane indifferente, io penso il problema sia con la funzione api che ti ho detto bisognerebeb solo vedere se non ne esista un'altra che sposti il focus senza dare questi problemi, anche perchè ora come ti dicevo questo è un piccolo esempio, ma la cosa non funzionerebeb nenache se nel timer invece di calcolare il tempo si faccia altro, io volevo infatti oltre che calcolare il tempo trascorso con un'altra api quella per leggere i tasti premuti fare in modo che tramite un evento timer leggesse i tasti premuti e che alla pressione di un determinato tasto chiudesse l'applicazione questa funzione la volevo fare anche perche nel mio esempio ho fatto un esempio con un ciclo di solo 3 ma se fosse piu lungo, non ci sarebeb la possibilità di uscire fino alal fine del ciclo.
lascuiando perdere questo ultimo pezzo ripeto il tutto funziona finche non viene lanciato la funzione api SetForegroundWindow.
Speriamo Che il grande Totem risponda e ci illumini
aaa
28/04/12 12:50
Il Totem
aaa