2011-01-20 38 views
11

(Tôi đã tìm kiếm câu trả lời SO và không tìm thấy giải pháp rõ ràng cho vấn đề này.)Làm thế nào để thực thi các chương trình bàn điều khiển con mà không hiển thị cửa sổ bảng điều khiển từ chương trình GUI Win32?

Tôi đang làm việc trên chương trình MFC GUI. Chương trình này chạy các chương trình con khác nhau bao gồm cả chương trình điều khiển và kịch bản lệnh shell (.cmd).

Ban đầu nó hiển thị một cửa sổ GUI và một cửa sổ bảng điều khiển (được tạo với AllocConsole) vì có nhiều đầu ra bàn điều khiển từ các tiến trình con. Nhưng nhiều người dùng phàn nàn về cửa sổ giao diện điều khiển nên chúng tôi đã quyết định ẩn cửa sổ bảng điều khiển.

Trước hết cố gắng như dưới đây:

if (AllocConsole()) 
{ 
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE); 
} 

Được rồi, không có cửa sổ giao diện điều khiển nhưng có thể nhìn thấy nhấp nháy đồng thời giao diện điều khiển sáng tạo. Tôi đã thử một số tùy chọn CreateProcess để tạo quy trình con để ngăn hiển thị cửa sổ bảng điều khiển hoàn toàn nhưng không thành công và tôi nghĩ rằng thực tế là không thể.

Nó không phải là một việc lớn. Chúng tôi có thể bỏ qua nhấp nháy cửa sổ tạm thời khi khởi động.

Nhưng thực sự không thể ẩn hoàn toàn cửa sổ bảng điều khiển dành cho trẻ em?

+1

Các nhấp nháy dự kiến; bạn đang tạo cửa sổ bảng điều khiển và sau đó ẩn nó. Câu hỏi là, tại sao bạn tạo cửa sổ bảng điều khiển ở tất cả, nếu bạn không muốn người dùng nhìn thấy nó? Có gì sai với 'ShellExecute' hoặc' CreateProcess'? –

+2

@Code Grey Chương trình này CreateProcess nhiều chương trình điều khiển khác nhau. Nếu không có AllocConsole, cửa sổ bảng điều khiển riêng biệt và không kiểm soát được sẽ được tạo ra, bị phá hủy mọi lúc. – 9dan

+0

Tôi không biết điều đó có nghĩa là gì. Bạn đang chạy một vài chương trình * console khác nhau và nếu bạn sử dụng 'CreateProcess' mỗi lần sẽ tạo cửa sổ bảng điều khiển mới thay vì sử dụng lại giao diện cũ? Ừ ... vậy sao? Có chuyện gì vậy? –

Trả lời

15

Thiết lập các STARTUPINFO như thế này cho các cuộc gọi CreateProcess:

STARTUPINFO si = { 0 }; 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
    si.wShowWindow = SW_HIDE; 
+3

Cảm ơn bạn! Nó hoạt động hoàn hảo khi sử dụng CreateProcess với tùy chọn CREATE_NO_WINDOW. – 9dan

+2

@Cody Grey: vấn đề là 'CreateProcess' của chính nó là không đủ, không phải là nó sai.Chuyển hướng I/O và cờ 'CREATE_NO_WINDOW' cũng là cần thiết. – MSalters

+1

Trong 'C#' sử dụng 'ProcessStartInfo' và đặt' WindowStyle = ProcessWindowStyle.Hidden'. Khá nhiều chỉ giống như NET Frameworked. – Bitterblue

Các vấn đề liên quan