Newsgroup: it.comp.lang.visual-basic
Titolo: Come attendere l'apertura di una finestra per poter inviare una sequenza di tasti?

Ciao a tutti,
ecco un nuovo quesito su cui scervellarsi:
Come attendere l'apertura di una finestra per poter inviare una sequenza di
tasti?
Normalmente l'apertura della finestra viene richiamata con il comando shell,
il che funziona a meraviglia, senonche' il problema e che con il
multitasking di windows l'esecuzione del programma VB continua l'esecuzione
inviando i tasti alla finestra con il comando SendKeys senza attendere
l'apertura della stessa (che soprattutto in pc vecchi avviene molto
lentamente),
COME PIZZETTA SI PUO' FARE??
Ringrazio tutti per la collaborazione!
Gianni

tasti?
a me vengono in mente solo due o tre doevents & Sleep subito dopo la
Shell...
Faber

 Gianni
Hai provato la funzione timer, in questo modo (kopiato dalle msdn, purtroppo
in inglese):
Dim PauseTime, Start, Finish, TotalTime
If (MsgBox("Press Yes to pause for 5 seconds", 4)) = vbYes Then
   PauseTime = 5   ' Set duration.
   Start = Timer   ' Set start time.
   Do While Timer < Start + PauseTime
      DoEvents   ' Yield to other processes.
   Loop
   Finish = Timer   ' Set end time.
   TotalTime = Finish - Start   ' Calculate total time.
   MsgBox "Paused for " & TotalTime & " seconds"
Else
   End
End If
A me funziona kome ciklo di attesa in altre situazioni!!!
Ciao.
Kris.

L'ideale sarebbe utilizzare la funzione WaitForInputIdle (API), che però,
come tutte le funzioni di wait, richiede l'handle di un process, non un ID
come quello ritornato da Shell. Al solito, o usi ShellExecuteEx o apri un
process sull'id ritornato da Shell e chiami WaitForInputIdle con l'handle
che ti ritorna uno dei due.
----------------------------------------------------------------------
Stefano Minardi
Zetesis: 
zet...@mclink.it
----------------------------------------------------------------------

 wrote in message
8b92ng$9kt$1...@news.mclink.it...


NB: questo esempio riguarda l'uso di Shell (VB) e non è stato provato. Se
hai problemi, fammelo sapere (spero che ci sia tutto).
Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle"
(ByVal hObject As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" Alias "OpenProcess"
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal
dwProcessId As Long) As Long
Public Declare Function WaitForInputIdle Lib "user32" Alias
"WaitForInputIdle" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As
Long
Public Const SYNCHRONIZE = &H100000
Public Const STATUS_TIMEOUT = &H102&
Public Const INFINITE = -1&
Public Function ShellAndWait(FileName As String) as Boolean
'si suppone che FileName contenga tutta la stringa di Shell (eseguibile,
parametri etc.)
On Error Goto Quit
dim pid as long, ph as long
ShellAndWait=FALSE
pid=Shell(FileName, Optional Timeout As Long = INFINITE)
ph=OpenProcess(SYNCHRONIZE,0,pid) 'su SYNCHRONIZE ho qualche dubbio... (fa
differenza solo su NT)
if ph = 0 then
    'il processo è verosimilmente terminato
    Err.Raise 20000,,"Processo terminato [" & Err.LastDLLError & "]"
end if
select case WaitForInputIdle(ph, Timeout)
    case 0
    case STATUS_TIMEOUT
        Err.Raise 20001,,"Timeout"
    case else '&hFFFFFFFF
        Err.Raise 20002,, "Si è verificato un errore nella chiamata a
WaitForInputIdle [" & Err.LastDllError & "]"
end select
ShellAndWait=TRUE
Quit:
if ph Then
    CloseHandle ph
End if
End Function
