Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Avviare un programma esterno continuando l'esecuzione

    Ciao a tutti!
    Voglio creare un'applicazione che apra un'altra applicazione esterna e esegua delle operazioni in essa con il comando sendInput. Per adesso ho trovato uno script che invia delle frasi come Input, all'inizio per verificare che funzionasse aprivo il notepad prima che iniziasse l'esecuzione, e tutto funzionava.
    Ora ho aggiunto la riga
    codice:
    system("notepad.exe");
    all'inizio del programma, che ora dovrebbe aprire il notepad e scrivervi delle parole dentro, invece apre il notepad e si interrompe, riparte solo quando ho chiuso il notepad.
    Sapete a cosa puo essere dovuto questo problema e come risolverlo?
    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    che la system non si usa... ecco perchè..

    esistono altri modi per eseguire processi esterni.. più standard, portabili e eleganti..

    ad esempio guarda qua http://www.codeguru.com/forum/showthread.php?t=302501

  3. #3
    Dipende dal fatto che l'interprete dei comandi attende la chiusura del programma prima di ritornare. Usa le apposite API di Windows per avviare i programmi (la CreateProcess in particolare) ed evita la system come la peste.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Grazie mille!
    Ora il programma non si interrompe più!
    Però ho un'altro problema:
    Anche se il notepad viene avviato il focus rimane sempre sull'applicazione C++, e quindi i sendInput non hanno effetto, conosci un modo per spostare il focus su una certa applicazione aperta?
    Grazie ancora per l'aiuto!

  5. #5
    Devi individuare la finestra principale dell'applicazione e attivarla. Per la prima operazione devi utilizzare EnumWindows per ottenere tutte le finestre aperte, di ciascuna - se è visibile (IsWindowVisible) ottenere l'ID del processo a cui appartiene (GetWindowThreadProcessId), confrontarlo con quello del processo appena creato (fornito dalla CreateProcess); una volta trovata tale finestra usa SetForegroundWindow per attivarla.
    Tra la chiamata a CreateProcess e l'inizio di tutte queste operazioni ti conviene chiamare WaitForInputIdle in modo da dare al processo modo di avviarsi prima che tu vada ad interferire con esso.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Grazie, adesso funziona (non so perchè prima non andasse).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.