2016-08-09 4 views
0

Je dois écrire un symbole dans la fenêtre de la console ou envoyer Entrez la clé. J'utilise le code de this answer avec quelques modifications:Comment envoyer un symbole ou 'Entrée' à cmd.exe démarré par CreateProcess

procedure Console_Std_Input_Test; 
var 
    sa: TSecurityAttributes; 
    si: TStartupInfo; 
    pi: TProcessInformation; 
    BytesWritten: LongWord; 
    hInRead, hInWrite: THandle; 
begin 
    // Initialize security information 
    sa.nLength := SizeOf(sa); 
    sa.lpSecurityDescriptor := nil; 
    sa.bInheritHandle := True; 
    CreatePipe(hInRead, hInWrite, @sa, 0); 
    // Initialize startup info 
    ZeroMemory(@si, SizeOf(si)); 
    si.cb := SizeOf(si); 
    si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; 
    si.wShowWindow := SW_SHOWNORMAL; 
    si.hStdInput := hInRead; 
    si.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE); 
    si.hStdError := GetStdHandle(STD_ERROR_HANDLE); 
    // Start process 
    ZeroMemory(@pi, SizeOf(pi)); 
    CreateProcess(nil, 'cmd /k ', nil, nil, True, 
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi); 
    CloseHandle(pi.hThread); 
    CloseHandle(hInRead); 
    // Write '<enter>' 
    WriteFile(hInWrite, #13#10, 2, BytesWritten, nil);// nothing happens!! 
    //WriteFile(hInWrite, #48#49#50, 3, BytesWritten, nil);//write "012"-nothing appears too! 
    CloseHandle(hInWrite); 
    // Wait for process to exit 
    WaitForSingleObject(pi.hProcess, INFINITE); 
    CloseHandle(pi.hProcess); 
end; 

J'ai passé toute la journée à essayer de résoudre ce problème, mais je ne peux pas comprendre comment envoyer Entrez ou des symboles à la console. J'ai regardé des exemples sur MSDN et support de Microsoft, mais n'ai pas trouvé quelque chose de différent du code ci-dessus, et ne peux vraiment pas comprendre où mon erreur est.

+0

Je voudrais essayer avec une commande plus simple comme «pause» pour voir si cela fonctionne. –

+0

@ Jean-François Fabre, oui, j'ai fait CreateProcess (nul, 'cmd/k pause' ...), et toujours rien ne se passe. La console attend la touche d'entrée – George

+0

Je veux juste dire «pause». Eh bien, je suppose que ça fera la même chose. Essayez d'ajouter plusieurs séquences # 13 # 10 aussi. –

Répondre

0

@Remu Lebeau répondu à la question dans les commentaires:

En particulier, vous ne supprimez pas HANDLE_FLAG_INHERIT de hInWrite avant d'appeler CreateProcess()

Ce fut mon erreur.