Ngăn chặn cửa sổ giao diện điều khiển đóng trên ứng dụng Bảng điều khiển Visual Studio C / C ++


464

Đây có lẽ là một câu hỏi ngượng ngùng vì không nghi ngờ gì câu trả lời rõ ràng là rõ ràng.

Tôi đã sử dụng Visual Studio trong nhiều năm, nhưng đây là lần đầu tiên tôi thực hiện bất kỳ phát triển 'Ứng dụng bảng điều khiển' nào.

Khi tôi chạy ứng dụng của mình, cửa sổ giao diện điều khiển bật lên, đầu ra chương trình xuất hiện và sau đó cửa sổ đóng lại khi ứng dụng thoát.

Có cách nào để giữ cho nó mở cho đến khi tôi đã kiểm tra đầu ra, hoặc xem kết quả sau khi cửa sổ đã đóng?


Monodevelop làm những gì bạn đang mong đợi.
ctrl-alt-delor

3
Có quá nhiều câu trả lời bên dưới nên tôi sao chép câu trả lời ở đây: nếu bạn đang sử dụng VS2017, thì Công cụ-> Tùy chọn-> Gỡ
lỗi-

Đã đồng ý. Tôi nghĩ rằng câu trả lời tốt nhất cho VS 2017 và mới hơn là câu trả lời của chronoxor.
Tất cả cơn thịnh nộ

Câu trả lời:


466

Nếu bạn chạy mà không gỡ lỗi (Ctrl + F5) thì theo mặc định, nó sẽ nhắc bạn nhấn return để đóng cửa sổ. Nếu bạn muốn sử dụng trình gỡ lỗi, bạn nên đặt một điểm dừng ở dòng cuối cùng.


268
Nếu bạn có ứng dụng C ++ và Chạy mà không cần gỡ lỗi và cửa sổ giao diện điều khiển vẫn đóng, bạn cần nhớ đặt rõ ràng Hệ thống con thành Bảng điều khiển trong Thuộc tính cấu hình / Trình liên kết / Hệ thống. Điều này có thể xảy ra nếu bạn bắt đầu với Dự án trống, khiến cho Hệ thống con không được đặt.
Trevor Robinson

4
Không hoạt động với tôi :( Cửa sổ giao diện điều khiển mở và tắt ngay lập tức, nhưng nhật ký tạm dừng và chờ thêm một lần nhấn F5
CodyBugstein

40
Câu trả lời đúng là của @TrevorRobinson: Đây là phiên bản mở rộng nếu bạn gặp khó khăn trong việc tìm ra các thuộc tính cấu hình: Nhấp chuột phải vào dự án của bạn trong Visual Studio> Thuộc tính> Thuộc tính cấu hình> Trình liên kết> Hệ thống, thay đổi Hệ thống con thành " Bảng điều khiển "
Bệnh dịch hạch

3
Trevor Robinson đã đúng. Nếu bạn bắt đầu một dự án trống và mục C ++. Bạn cần truy cập View-> Trình quản lý tài sản-> Thuộc tính (biểu tượng cờ lê) -> Cấu hình. Thuộc tính-> Trình liên kết-> Hệ thống-> Hệ thống con-> trong menu bật xuống, chọn Bảng điều khiển.
thưa ngài đáng kính nhất

10
Tôi đang làm việc trên cộng đồng VS 2017. ctrl+f5không hoạt động, không có Propertieskhi tôi nhấp chuột phải vào dự án, cũng wrench iconcó màu xám.
Ketan

232

Nhấp chuột phải vào dự án của bạn

Thuộc tính> Thuộc tính cấu hình> Trình liên kết> Hệ thống

Chọn Bảng điều khiển (/ SUBSYSTEM: TIÊU THỤ) trong SubSystemtùy chọn hoặc bạn chỉ có thể nhập Bảng điều khiển trong trường văn bản!

Bây giờ hãy thử nó ... nó sẽ hoạt động


Điều này đã làm việc cho VS2013 Express của tôi, nhưng câu trả lời được chấp nhận thì không. Rất lạ, vì câu trả lời được chấp nhận đã hoạt động cho tất cả các phiên bản Visual Studio tôi đã sử dụng trong quá khứ.
Michael Calvin

9
@MichaelCalvin Bạn phải chạy bằng Ctrl + F5 sau khi cài đặt cái này, đó là kicker.
Jonathan Mee

như @JonathanMee nói rằng bạn vẫn chạy Ctrl + F5. Điều này đã được đặt trong studio hình ảnh của tôi năm 2015, vì vậy câu trả lời đầu tiên là câu trả lời hữu ích nhất.

Điều này thực sự chính xác. Sự quen thuộc CTRL+F5sẽ thất bại nếu bạn nói, thêm một tệp C ++ mới vào một dự án trống.
2023370

Làm việc cho tôi trên Visual Studio Express 2015. Cảm ơn.
LHC

44

Đây là một cách cho C / C ++:

#include <stdlib.h>

#ifdef _WIN32
    #define WINPAUSE system("pause")
#endif

Đặt cái này ở đầu chương trình của bạn và NẾU nó nằm trên một hệ thống Windows ( #ifdef _WIN32), thì nó sẽ tạo ra một macro được gọi WINPAUSE. Bất cứ khi nào bạn muốn chương trình của bạn tạm dừng, hãy gọi WINPAUSE;và nó sẽ tạm dừng chương trình, sử dụng lệnh DOS. Đối với các hệ thống khác như Unix / Linux, bàn điều khiển không nên thoát khỏi chương trình thoát.


Phương pháp này không hoạt động trong Visual C ++ (trừ khi bạn bao gồm một số tiêu đề?)
wmac

2
@wmac Bạn phải bao gồm tiêu đề windows.h
Geowil

1
Tôi không bao gồm bất kỳ thư viện hoặc không gian tên nào nhưng nó chạy chính xác, cảm ơn rất nhiều.
Halil İbrahim Oymacı 19/03/2016

1
Đừng làm vậy, làm ơn. Các pauselệnh là đặc trưng cho Windows.
firegurafiku

Làm việc cho tôi trên Visual Studio 2013 Express. :)
Anirban

32

Menu gỡ lỗi Goto-> Nhấn StartWithoutDebugging


Đây thậm chí không phải là một tùy chọn trong VS 2008 trừ khi Môi trường phát triển C # được chọn. CTRL + F5 hoạt động mặc dù. Bạn cũng có thể thêm nút này dưới dạng nút vào thanh công cụ thông qua Công cụ> Tùy chỉnh.
perry

Nếu bạn có nhiều dự án, hãy đặt dự án có liên quan làm dự án khởi động
CAD bloke

27

Nếu bạn đang sử dụng .NET, hãy đặt Console.ReadLine()trước khi kết thúc chương trình.

Nó sẽ chờ đợi <ENTER>.


9
+1 - Hoặc là hoặc Console.ReadKey()chỉ chờ bất kỳ khóa nào.
Fredrik Mörk

Thật kỳ lạ, điều này không có tác dụng trong ứng dụng của tôi. Nó vẫn đóng mà không cần chờ người dùng nhập liệu.
Kokodoko

4
Sau đó, mã của bạn rất có thể thoát ra trước khi nó đạt đến điểm đó.
Thật vậy,

20

Bắt đầu từ Visual Studio 2017 (15.9.4) có một tùy chọn:

Tools->Options->Debugging->Automatically close the console

Đoạn tương ứng từ tài liệu Visual Studio :

Tự động đóng bàn điều khiển khi dừng gỡ lỗi:

Yêu cầu Visual Studio đóng giao diện điều khiển vào cuối phiên gỡ lỗi.


2
Tôi vừa thử nghiệm điều này trong VS2017 và VS2019. Nó yêu cầu cả thiết lập hệ thống con thành TIÊU THỤ và tắt tùy chọn này. Có cái này hoặc cái kia hoặc không tự động đóng cửa sổ.
Casey

Điều này vẫn đóng cửa sổ cho tôi nếu tôi khởi chạy nhiều dự án từ cùng một giải pháp.
Serge Rogatch

Tôi cảm thấy như đây là câu trả lời đúng cho VS 2017 và chuyển tiếp. Quá tệ, nó không phải trong các phiên bản cũ.
Tất cả cơn thịnh nộ

13

cố gắng gọi getchar()ngay trước khi main()trở về.


Không hoạt động trong VS 2008 cho một ứng dụng bảng điều khiển Hello Name đơn giản. cout, cin, cout, getchar (), console vẫn đóng. Thỏa thuận là gì?

1
Hãy thử đặt getchar () hai lần nếu bạn có một cout ngay trước khi getchar (). getchar () mong đợi một char và bạn đã cho nó với cout ... Hãy cho tôi biết nếu điều này có ích :)
Magarusu

12

(/ SUBSYSTEM: TIÊU THỤ) đã không hoạt động cho năm 2013 của tôi (tôi đã có nó).

"Chạy mà không gỡ lỗi" không phải là một tùy chọn, vì tôi không muốn chuyển đổi giữa gỡ lỗi và xem đầu ra.

Tôi đã kết thúc với

int main() {
  ...
#if _DEBUG
  LOG_INFO("end, press key to close");
  getchar();
#endif // _DEBUG
  return 0;
}

Giải pháp được sử dụng trong qtcreator trước 2.6. Bây giờ trong khi qt đang phát triển, vs đang đi theo một cách khác. Theo tôi nhớ, trong vs2008 chúng tôi không cần những thủ thuật như vậy.


7

Đây là một giải pháp mà (1) không yêu cầu bất kỳ thay đổi hoặc điểm dừng mã nào và (2) tạm dừng sau khi chấm dứt chương trình để bạn có thể thấy mọi thứ được in. Nó sẽ tạm dừng sau F5 hoặc Ctrl + F5. Nhược điểm chính là trên VS2013 Express (như đã được thử nghiệm), nó không tải các ký hiệu, vì vậy việc gỡ lỗi rất hạn chế.

  1. Tạo một tệp bó. Tôi gọi cho tôi runthenpause.bat, với các nội dung sau:

    %1 %2 %3 %4 %5 %6 %7 %8 %9
    pause

    Dòng đầu tiên sẽ chạy bất cứ lệnh nào bạn cung cấp và tối đa tám đối số. Dòng thứ hai sẽ ... tạm dừng.

  2. Mở thuộc tính dự án | Cấu hình thuộc tính | Gỡ lỗi.

  3. Thay đổi "Đối số lệnh" thành $(TargetPath)(hoặc bất cứ điều gì trong "Lệnh").
  4. Thay đổi "Lệnh" thành đường dẫn đầy đủ đến runthenpause.bat.
  5. Nhấn OK.

Bây giờ, khi bạn chạy, runthenpause.batsẽ khởi chạy ứng dụng của bạn và sau khi ứng dụng của bạn kết thúc, sẽ tạm dừng để bạn xem đầu ra của giao diện điều khiển.

Tôi sẽ đăng một bản cập nhật nếu tôi tìm ra cách tải các biểu tượng. Tôi đã cố gắng /Z7theo điều này nhưng không thành công.


1
Điều này vẫn không hỗ trợ gỡ lỗi, nhưng ít nhất nó giải quyết vấn đề không thể nhìn thấy đầu ra, ví dụ như VLD, trái ngược với tất cả các câu trả lời khác.
Martin Hennings

6

chỉ cần đặt làm dòng mã cuối cùng của bạn:

system("pause");

3

Bạn có thể chạy thực thi của bạn từ một dấu nhắc lệnh. Bằng cách này bạn có thể thấy tất cả đầu ra. Hoặc, bạn có thể làm một cái gì đó như thế này:

int a = 0;
scanf("%d",&a);

return YOUR_MAIN_CODE;

và theo cách này, cửa sổ sẽ không đóng cho đến khi bạn nhập dữ liệu cho abiến.


3

thêm vào | tạm dừng trong hộp đối số lệnh trong phần gỡ lỗi tại thuộc tính dự án.


4
Đây sẽ là một giải pháp tuyệt vời nếu nó hoạt động. pausedường như chỉ hoạt động trong các tệp bó và trong khi nó nhận được đầu vào từ chương trình của bạn trên STDIN, nó không in lại văn bản đó. Tôi đã thử thay thế |bằng&& , nhưng nó không có hiệu quả - có lẽ vì nó không thực thi với shell lệnh (cmd.exe).
Brian Vandenberg

3

Chỉ cần nhấn CNTRL + F5 để mở nó trong cửa sổ dòng lệnh bên ngoài (Visual Studio không có quyền kiểm soát nó).

Nếu điều này không hiệu quả thì hãy thêm đoạn mã sau vào cuối mã của bạn:

Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Điều này chờ bạn nhấn một phím để đóng cửa sổ terminal sau khi mã đã kết thúc.

Nếu bạn muốn làm điều này ở nhiều nơi, hãy đặt đoạn mã trên vào một phương thức (ví dụ: private void Pause() ) và gọi Pause()bất cứ khi nào một chương trình đạt đến kết thúc có thể.


Khi tôi làm cntrl + f5 thì nó mở rồi đóng ngay lập tức? Làm thế nào để bạn khắc phục điều đó?
Callat

Giải pháp thứ hai là những gì tôi đang tìm kiếm!
RoG

Khi tôi nhấn Ctrl + F5, không có gì xảy ra. Nó đã từng làm việc cho tôi nhưng đột nhiên, nó ngừng hoạt động.
Natasha

2

Một giải pháp tốt hơn:

atexit([] { system("PAUSE"); });

vào đầu chương trình của bạn.

Ưu điểm:

  • có thể sử dụng std :: exit ()
  • có thể có nhiều lợi nhuận từ chính
  • bạn có thể chạy chương trình của bạn theo trình gỡ lỗi
  • IDE độc lập (+ HĐH độc lập nếu bạn sử dụng cin.sync(); cin.ignore();thủ thuật thay vì system("pause");)

Nhược điểm:

  • phải sửa đổi mã
  • sẽ không tạm dừng trên std :: terminating ()
  • vẫn sẽ xảy ra trong chương trình của bạn bên ngoài phiên IDE / trình gỡ lỗi; bạn có thể ngăn điều này trong Windows bằng cách sử dụng:

extern "C" int __stdcall IsDebuggerPresent(void);
int main(int argc, char** argv) {
    if (IsDebuggerPresent())
        atexit([] {system("PAUSE"); });
    ...
}

Lời khuyên rất tệ.
Chúc mừng và hth. - Alf

Bạn có thể giải thích tại sao?
GhassanPL

Trong trường hợp một người không gỡ lỗi thì không có gì hữu ích, vì trong trường hợp này không có vấn đề gì cần giải quyết. Trong VS chỉ chạy chương trình với Ctrl + F5 và đó là vậy, vì vậy không có vấn đề gì trong VS, và trong một trình thông dịch lệnh, không có vấn đề gì, nói tóm lại, không có vấn đề gì. Và trong trường hợp một người đang gỡ lỗi và muốn dừng mã được thêm vào thì đó không phải là giải pháp thuận tiện hơn điểm dừng và can thiệp vào các tình huống mà người ta không muốn dừng lại.
Chúc mừng và hth. - Alf

2

Sử dụng:

  1. cin.get();

hoặc là

  1. system("pause");

Hãy chắc chắn để thực hiện một trong số chúng ở cuối main()chức năng và trước returncâu lệnh.


2

Bạn cũng có thể sử dụng tùy chọn này

#include <conio.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main() {
   .
   .
   .
   getch(); 

   return 0;
}

2

Trong trường hợp của tôi, tôi đã trải nghiệm điều này khi tôi tạo một dự án Empty C ++ trên phiên bản cộng đồng VS 2017. Bạn sẽ cần đặt Hệ thống con thành "Bảng điều khiển (/ SUBSYSTEM: TIÊU THỤ)" trong Thuộc tính cấu hình.

  1. Chuyển đến "Xem", sau đó chọn "Trình quản lý tài sản"
  2. Nhấp chuột phải vào dự án / giải pháp và chọn "Tài sản". Điều này sẽ mở ra một trang thuộc tính Test
  3. Điều hướng đến trình liên kết, sau đó chọn "Hệ thống"
  4. Nhấp vào "Hệ thống con" và xuất hiện thả xuống
  5. Chọn "Bảng điều khiển (/ SUBSYSTEM: TIÊU THỤ)"
  6. Áp dụng và lưu
  7. Lần tới khi bạn chạy mã của mình với "CTRL + F5", bạn sẽ thấy đầu ra.

0

Visual Studio 2015 , với hàng nhập khẩu . Bởi vì tôi ghét khi các ví dụ mã không cung cấp nhập khẩu cần thiết.

#include <iostream>;

int main()
{
    getchar();
    return 0;
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.