2015-04-21 2 views
7

Я пытаюсь разработать программу, которая использует библиотеку sdl2. Он отлично работает до сих пор, но когда я запускаю программу, я получаю два окна - окно sdl2 и консольное окно.Как создать программу, которая не отображает окно консоли?

Как скрыть или не создать консольное окно? Может быть, есть что-то вроде WinMain?

ответ

9

Rust 1.18 представил атрибут подсистемы Windows. Выключите консоль с:

#![windows_subsystem = "windows"] 

ржавчину двоичные файлы связаны с GCC набора инструментов. Чтобы запустить программу без появления окна командной строки, вам необходимо указать pass the -mwindows option to the linker.

Cargo has a cargo rustc mode, который может использоваться для передачи дополнительных флагов на rustc. До этого было введено, there was no known way to pass an option to the compiler with Cargo.

В этих случаях один обходной путь, чтобы скрыть окно после того, как оно было создано:

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); 
     } 
    } 
} 

Вам потребуется следующее в вашем Cargo.toml скомпилировать:

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

Чтобы запустить его с существующей консоли или IDE, возможно:

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

Этот второй метод не работает для r me, потому что я запускаю приложение из пакетного файла. Понимаете, пакет все еще владеет консолью, поэтому он остается на экране.

+0

Благодарим вас за такой полезный ответ. Я буду ждать несколько часов для других ответов и принять их, если ничего лучше не появится :) – Revertron

+0

Несомненно, я буду рад узнать о решении теста, даже если это займет три года. – ArtemGr

+0

@ArtemGr ['GetConsoleWindow'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683175%28v=vs.85%29.aspx) возвращает дескриптор окна консоли. –

7

Через некоторое время я нашел отличный ответ! У груза теперь есть очень полезная подкоманда - rustc.

Команда полной сборки, как это:

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

Теперь мы можем построить отладочную версию с регулярными cargo build, и когда мы должны сделать окончательные сборки, мы можем использовать эту команду:

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

Этот ответ применяется только в том случае, если вы используете GCC, а не программную цепочку MSVC. Пожалуйста, см. Ответ GhotiPhud ниже, если вы используете инструментальную цепочку MSVC. –

6

Добавляя к ответу Романа Бэя, если вы используете программную цепочку MSVC, вы захотите передать MSVC-компоновщики ссылок.

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

Вскоре https://github.com/rust-lang/rust/pull/37501 приземлится, что реализация RFC 1665 и правильный ответ будет

#![windows_subsystem = "windows"] 

в корневом каталоге клеть.

+0

Это уже упоминалось в [верхнем ответе] (http://stackoverflow.com/a/29764309/155423). – Shepmaster

+0

Ах! я скучаю по этому –

Смежные вопросы