2015-04-21 17 views

risposta

9

Rust 1.18 ha introdotto un attributo Sottosistema Windows. Spegnere la console con: binari

#![windows_subsystem = "windows"] 

la ruggine sono collegati con la toolchain GCC. Per avviare un programma senza generare una finestra della riga di comando, è necessario pass the -mwindows option to the linker.

Carico has a cargo rustc mode che può essere utilizzato per passare altri flag a rustc. Prima che fosse introdotto, there was no known way to pass an option to the compiler with Cargo.

In questi casi, una soluzione è quella di nascondere la finestra dopo che è stato creato:

extern crate winapi; 
extern crate user32; 
extern crate kernel32; 

use std::ptr; 

fn hide_console_window() { 
    let window = unsafe {kernel32::GetConsoleWindow()}; 
    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx 
    if window != ptr::null_mut() { 
     unsafe { 
      user32::ShowWindow(window, winapi::SW_HIDE); 
     } 
    } 
} 

Avrete bisogno di quanto segue nel Cargo.toml compilarlo:

[dependencies] 
winapi = "*" 
user32-sys = "*" 
kernel32-sys = "*" 

Possibile eseguirlo da una console o IDE esistente:

fn hide_console_window() { 
    unsafe { kernel32::FreeConsole() }; 
} 

Questo secondo metodo non funziona per r me perché sto avviando la mia applicazione da un file batch. Vedete, il lotto possiede ancora la console in modo che mantenga il suo aspetto sullo schermo.

+0

Grazie per la risposta così utile. Aspetterò diverse ore per altre risposte e accetto il tuo se non emergerà nulla di meglio :) – Revertron

+0

Certo, sarò felice di apprendere una soluzione pastella anche se ci vorranno tre anni. – ArtemGr

+0

@ArtemGr ['GetConsoleWindow'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683175%28v=vs.85%29.aspx) restituisce un handle per la finestra della console. –

7

Dopo un po 'di tempo ho trovato una risposta perfetta! Cargo ora ha sottocomando molto utile - rustc.

Il comando completo build è simile a questo:

cargo rustc -- -Clink-args="-Wl,--subsystem,windows" 

Ora possiamo costruire build di debug con regolare cargo build, e quando abbiamo bisogno di fare una build finale possiamo usare questo comando:

cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows" 
+0

Questa risposta è valida solo se si utilizza GCC, non la toolchain MSVC. Per favore guarda la risposta di GhotiPhud qui sotto se stai usando la toolchain MSVC. –

6

Aggiungendo alla risposta di Roman Quick se si sta utilizzando la toolchain MSVC, si preferisce passare invece gli argomenti del linker MSVC.

cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup" 
6

Presto, https://github.com/rust-lang/rust/pull/37501 atterreranno, che è un'implementazione di RFC 1665 e la risposta corretta sarà

#![windows_subsystem = "windows"] 

nella root cassa.

+0

Questo è già menzionato nella [risposta in alto] (http://stackoverflow.com/a/29764309/155423). – Shepmaster

+0

Ah! L'ho perso –

Problemi correlati