Newsgroup: it.comp.lang.visual-basic
Titolo: Shell e SendKeys

Salve a tutti.
Sono qua ancora perchč non riesco a lanciare un programma esterno con la
funzione Shell.
Ho deciso di lanciare il cmd.exe e poi simulare la pressione dei tasti sulla
tastiera.
il codice che uso č qua sotto, penso che i nomi delle variabili siano
chiari.
Ho dovuto inserire il ciclo Do-Loop perchč altrimenti mi si mangiano dei
caratteri.
Ora: anche cosě non funziona! Il numero di caratteri che apapre sullo
schermo non č corrispondente ai comandi e il software non si comporta sempre
nella stessa maniera.
E' possibile che dipenda dal carico della mia macchina?
Sbaglio qualcosa di clamoroso?
Grazie
Pelo
    ProcessID = Shell("cmd.exe", vbNormalFocus)
    Aspetta = 0
    Do
        Aspetta = Aspetta + 1
    Loop Until Aspetta = 20000000
    AppActivate ProcessID, False
    SendKeys CStr("    ")
    SendKeys CStr("   cd " & TempPath & Chr(13)), True
    SendKeys CStr("    ")
    SendKeys CStr(Comando & Chr(13)), True

     SendKeys CStr(Comando & Chr(13)), True
Ecco, ora io mi chiedo una cosa: ma perché ti devi fare del male cosě?!?!?
Crea un file batch ed esegui quello!
Eccoti un esempio:
Sub Test()
Dim TempFile    As String
Dim Commands    As String
    ' Crea il file batch nella cartella dei file temporanei del sistema (ad
esempio)
    TempFile = Environ("TEMP") & "\mycommands.bat"
    ' Comandi di prova
    Commands = "CD C:\Windows" & vbCrLf _
             & "DIR *.DLL > FILELIST.TXT"
    CreateBatch TempFile, Commands
    ExecuteBatch TempFile, Wait:=True
End Sub
Chiaramente ti occorrono i "mattoncini" che consistono nelle due seguenti Sub,
una crea il batch l'altra lo esegue
Sub CreateBatch(ByVal FileName As String, ByVal Commands As String)
Dim f As Long
    On Error Resume Next
    Kill FileName
    On Error GoTo 0
    f = FreeFile
    Open FileName For Output As f
    Print #f, Commands
    Close #f
End Sub
Sub ExecuteBatch(ByVal FileName As String, Optional ByVal Wait As Boolean =
False)
Dim ProcessID   As Long
    ProcessID = Shell(Environ("COMSPEC") & " /C " & FileName)
    If Wait Then
        Do While IsProcessRunning(ProcessID)
            DoEvents
        Loop
    End If
End Sub
Per essere in grado di attendere il completamento del batch, occorre perň usare
delle API:
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As
Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As
Long
Const STILL_ACTIVE = &H103&
Const PROCESS_ALL_ACCESS = &H1F0FFF
Function IsProcessRunning(ByVal idProc As Long) As Boolean
Dim hProc   As Long
Dim iExit   As Long
    ' Get process handle
    hProc = OpenProcess(PROCESS_ALL_ACCESS, False, idProc)
    If hProc = 0 Then
        IsProcessRunning = False
    Else
        GetExitCodeProcess hProc, iExit
        IsProcessRunning = (iExit = STILL_ACTIVE)
    End If
    CloseHandle hProc
End Function
Spero di esserti stato utile...
Bye
Raf

"Rafunk" <rafun...@NOTHANKSlibero.it> ha scritto nel messaggio
news:cn084c$nh8$1...@alix.livenet.it...
Tutto risolto!!!!
Grazie mille e buon weekend!
Pelo