Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problemi con evento Timer
Forum - C# / VB.NET - Problemi con evento Timer

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 13:42
Venerdì, 27/04/2012
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.

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2. Public Class FrmCronometro
  3.     'Ipvoke per i vari metodi
  4.     'Richiamo funzioni da libreria windows per trovare la finestra attiva
  5.     <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  6.     Private Shared Function FindWindow( _
  7.      ByVal lpClassName As String, _
  8.      ByVal lpWindowName As String) As IntPtr
  9.     End Function
  10.     '----------------------------------------------------------------------
  11.     'Funzione per dare lo stato attivo alal finestra che e selezionata con la funzione findwindows
  12.     <DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
  13.     Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
  14.     End Function
  15.  
  16.  
  17.     Dim TestoOra As String = "00"
  18.     Dim TestoMinuti As String = "00"
  19.     Dim TestoSecondi As String = "00"
  20.  
  21.     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  22.         'Avvio il cronometro
  23.         Timer1.Start()
  24.         'Avvio le operazioni da eseguire
  25.         prova()
  26.         'spengo il cronometro in modo da visualizzare il tempo impiegato tra i 2 programmi
  27.         Timer1.Stop()
  28.     End Sub
  29.     Private Sub prova()
  30.         Dim i As Integer = 1
  31.         Do
  32.             'trovo l'handle dell'applicazione da cercare
  33.             Dim HandleRoulette = FindWindow(vbNullString, "Google - Windows Internet Explorer")
  34.             'Do il focus all'aplicazione esterna
  35.             SetForegroundWindow(HandleRoulette)
  36.             'Metto un timer per dare il tempo per utilizzare la finestra
  37.             System.Threading.Thread.Sleep(1000)
  38.             'Rimetto la mia finestra in focus per aggiornare la mia applicazione
  39.             SetForegroundWindow(Me.Handle)
  40.             'do del tempo prima di ripetere l'operazione
  41.             System.Threading.Thread.Sleep(1000)
  42.             i += 1
  43.         Loop Until i = 3
  44.     End Sub
  45.     Private Sub FrmCronometro_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  46.         Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
  47.     End Sub
  48.  
  49.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  50.         TestoSecondi = TestoSecondi + 1
  51.         If TestoSecondi < 10 Then
  52.             TestoSecondi = "0" & TestoSecondi
  53.         End If
  54.         If TestoSecondi = 60 Then
  55.             TestoSecondi = "00"
  56.             TestoMinuti = TestoMinuti + 1
  57.             If TestoMinuti < 10 Then
  58.                 TestoMinuti = "0" & TestoMinuti
  59.             End If
  60.             If TestoMinuti = 60 Then
  61.                 TestoMinuti = "00"
  62.                 TestoOra = TestoOra + 1
  63.                 If TestoOra < 10 Then
  64.                     TestoOra = "0" & TestoOra
  65.                 End If
  66.             End If
  67.         End If
  68.         Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
  69.     End Sub
  70. 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?


Fabio
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 20:45
Venerdì, 27/04/2012
Testo quotato

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.

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2. Public Class FrmCronometro
  3.     'Ipvoke per i vari metodi
  4.     'Richiamo funzioni da libreria windows per trovare la finestra attiva
  5.     <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  6.     Private Shared Function FindWindow( _
  7.      ByVal lpClassName As String, _
  8.      ByVal lpWindowName As String) As IntPtr
  9.     End Function
  10.     '----------------------------------------------------------------------
  11.     'Funzione per dare lo stato attivo alal finestra che e selezionata con la funzione findwindows
  12.     <DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
  13.     Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
  14.     End Function
  15.  
  16.  
  17.     Dim TestoOra As String = "00"
  18.     Dim TestoMinuti As String = "00"
  19.     Dim TestoSecondi As String = "00"
  20.  
  21.     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  22.         'Avvio il cronometro
  23.         Timer1.Start()
  24.         'Avvio le operazioni da eseguire
  25.         prova()
  26.         'spengo il cronometro in modo da visualizzare il tempo impiegato tra i 2 programmi
  27.        
  28.     End Sub
  29.     Private Sub prova()
  30.         Dim i As Integer = 1
  31.         Do
  32.             'trovo l'handle dell'applicazione da cercare
  33.             Dim HandleRoulette = FindWindow(vbNullString, "Google - Windows Internet Explorer")
  34.             'Do il focus all'aplicazione esterna
  35.             SetForegroundWindow(HandleRoulette)
  36.             'Metto un timer per dare il tempo per utilizzare la finestra
  37.             System.Threading.Thread.Sleep(1000)
  38.             'Rimetto la mia finestra in focus per aggiornare la mia applicazione
  39.             SetForegroundWindow(Me.Handle)
  40.             'do del tempo prima di ripetere l'operazione
  41.             System.Threading.Thread.Sleep(1000)
  42.             i += 1
  43.         Loop Until i = 3
  44.         Timer1.Stop()
  45.     End Sub
  46.     Private Sub FrmCronometro_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  47.         Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
  48.     End Sub
  49.  
  50.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  51.         TestoSecondi = TestoSecondi + 1
  52.         If TestoSecondi < 10 Then
  53.             TestoSecondi = "0" & TestoSecondi
  54.         End If
  55.         If TestoSecondi = 60 Then
  56.             TestoSecondi = "00"
  57.             TestoMinuti = TestoMinuti + 1
  58.             If TestoMinuti < 10 Then
  59.                 TestoMinuti = "0" & TestoMinuti
  60.             End If
  61.             If TestoMinuti = 60 Then
  62.                 TestoMinuti = "00"
  63.                 TestoOra = TestoOra + 1
  64.                 If TestoOra < 10 Then
  65.                     TestoOra = "0" & TestoOra
  66.                 End If
  67.             End If
  68.         End If
  69.         Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
  70.     End Sub
  71. 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.


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 21:34
Venerdì, 27/04/2012
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.


Fabio
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:24
Venerdì, 27/04/2012
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2.     Public Class FrmCronometro
  3.         'Ipvoke per i vari metodi
  4.         'Richiamo funzioni da libreria windows per trovare la finestra attiva
  5.         <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  6.         Private Shared Function FindWindow( _
  7.          ByVal lpClassName As String, _
  8.          ByVal lpWindowName As String) As IntPtr
  9.         End Function
  10.         '----------------------------------------------------------------------
  11.         'Funzione per dare lo stato attivo alal finestra che e selezionata con la funzione findwindows
  12.         <DllImport("user32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
  13.         Public Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
  14.         End Function
  15.      
  16.         Dim Ora As int16 = 0
  17.         Dim Minuti As in16 = 0
  18.         Dim Secondi As int16 = 0
  19.        
  20.         Dim TestoOra As String = "00"
  21.         Dim TestoMinuti As String = "00"
  22.         Dim TestoSecondi As String = "00"
  23.      
  24.         Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
  25.             'Avvio il cronometro
  26.             Timer1.Start()
  27.             'Avvio le operazioni da eseguire
  28.             prova()
  29.             'spengo il cronometro in modo da visualizzare il tempo impiegato tra i 2 programmi
  30.            
  31.         End Sub
  32.         Private Sub prova()
  33.             Dim i As Integer = 1
  34.             Do
  35.                 'trovo l'handle dell'applicazione da cercare
  36.                 Dim HandleRoulette = FindWindow(vbNullString, "Google - Windows Internet Explorer")
  37.                 'Do il focus all'aplicazione esterna
  38.                 SetForegroundWindow(HandleRoulette)
  39.                 'Metto un timer per dare il tempo per utilizzare la finestra
  40.                 System.Threading.Thread.Sleep(1000)
  41.                 'Rimetto la mia finestra in focus per aggiornare la mia applicazione
  42.                 SetForegroundWindow(Me.Handle)
  43.                 'do del tempo prima di ripetere l'operazione
  44.                 System.Threading.Thread.Sleep(1000)
  45.                 i += 1
  46.             Loop Until i = 3
  47.             Timer1.Stop()
  48.         End Sub
  49.         Private Sub FrmCronometro_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  50.             Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
  51.         End Sub
  52.      
  53.         Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  54.             Secondi = Secondi + 1
  55.             If Secondi < 10 Then
  56.                 TestoSecondi = "0" & Secondi
  57.               else
  58.                  TestoSecondi = Secondi
  59.             End If
  60.             If Secondi = 60 Then
  61.                 Secondi = 0
  62.                 Minuti = Minuti + 1
  63.                 If Minuti < 10 Then
  64.                     TestoMinuti = "0" & Minuti
  65.                    else
  66.                     TestoMinuti =  Minuti
  67.                 End If
  68.                 If Minuti = 60 Then
  69.                     Minuti = 0
  70.                     Ora = Ora + 1
  71.                     If Ora < 10 Then
  72.                         TestoOra = "0" & Ora
  73.                        else
  74.                         TestoOra =  Ora
  75.                     End If
  76.                 End If
  77.             End If
  78.             Me.Text = "Mia app" & " - Tempo Trascorso: " & TestoOra & ":" & TestoMinuti & ":" & TestoSecondi
  79.         End Sub
  80.     End Class



    Guarda adesso

Ultima modifica effettuata da Ultimo il 28/04/2012 alle 11:28


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 23:58
Venerdì, 27/04/2012
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?


Fabio
PM Quote
Avatar
Ultimo (Member)
Expert


Messaggi: 513
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 11:35
Sabato, 28/04/2012
Bisogna attendere il grande Totem ;)

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

else.  

Ultima modifica effettuata da Ultimo il 28/04/2012 alle 12:09


Ultimo (Hai voluto la bicicletta ? ....)

Studiare LINQ, WPF, ASP.NET MVC, Entity Framwork, C#, Blend, XAML, Javascript, HTML5, CSS .....(tanta roba)

https://www.dropbox.com/s/c2aots5x4urgbhf/setup_game_sudoku ...
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 13:19
Sabato, 28/04/2012
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


Fabio
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:50
Sabato, 28/04/2012


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
pescarese77 (Normal User)
Newbie


Messaggi: 17
Iscritto: 02/02/2012

Segnala al moderatore
Postato alle 23:26
Sabato, 28/04/2012
letto la funzione in questione e lo richiamata cosi
Codice sorgente - presumibilmente VB.NET

  1. <DllImport("user32.dll")> _
  2.     Shared Function AllowSetForegroundWindow(ByVal dwProcessId As Integer) As Boolean
  3.     End Function


sotto le dichiarazioni poi ho letto che per usarla devo mettere questo circa
Codice sorgente - presumibilmente Plain Text

  1. AllowSetForegroundWindow(System.Diagnostics.Process.GetCurrentProcess().Id)



ma non riesco a capire in che punto la devo mettere, sono un enofilo se mi puoi dare una mano te ne sarei veramente grado mi basta anche un mini esempio per capire come funzional la funzione da te proposta e come utilizarla nel mio esempio

dalla traduzione della pagina ho letto questo

Consente il processo specificato impostare la finestra in primo piano, utilizzando la funzione SetForegroundWindow . Il processo di chiamata deve essere già in grado di impostare la finestra in primo piano. Per ulteriori informazioni, vedere la sezione osservazioni più avanti in questo argomento.
ti ringrazio anticipatamente per la pazienza


Fabio
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo