การป้องกันไม่ให้หน้าต่างคอนโซลปิดในแอปพลิเคชันคอนโซล Studio C / C ++ Visual


464

นี่อาจเป็นคำถามที่น่าอายเพราะไม่ต้องสงสัยเลยว่าคำตอบนั้นชัดเจนมาก

ฉันใช้ Visual Studio มาหลายปีแล้ว แต่นี่เป็นครั้งแรกที่ฉันได้ทำการพัฒนา 'Console Application'

เมื่อฉันเรียกใช้แอปพลิเคชันของฉันหน้าต่างคอนโซลจะปรากฏขึ้นเอาต์พุตของโปรแกรมจะปรากฏขึ้นจากนั้นหน้าต่างจะปิดลงเมื่อแอปพลิเคชันออก

มีวิธีที่จะเปิดไว้หรือไม่จนกว่าฉันจะตรวจสอบผลลัพธ์หรือดูผลลัพธ์หลังจากปิดหน้าต่างแล้วหรือไม่


Monodevelop ทำในสิ่งที่คุณคาดหวัง
ctrl-alt-delor

3
มีคำตอบด้านล่างมากเกินไปดังนั้นฉันจึงคัดลอกคำตอบไว้ที่นี่: หากคุณใช้ VS2017 ดังนั้นเครื่องมือ -> ตัวเลือก -> การแก้จุดบกพร่อง -> ปิดคอนโซลโดยอัตโนมัติ
jw_

ตกลง ฉันคิดว่าคำตอบที่ดีที่สุดสำหรับ VS 2017 และใหม่กว่าคือคำตอบโดย chronoxor
ความโกรธเกรี้ยวทั้งหมด

คำตอบ:


466

หากคุณรันโดยไม่ดีบัก (Ctrl + F5) ตามค่าเริ่มต้นระบบจะแจ้งให้คุณกดย้อนกลับเพื่อปิดหน้าต่าง ถ้าคุณต้องการใช้ดีบักเกอร์คุณควรใส่เบรกพอยต์ในบรรทัดสุดท้าย


268
หากคุณมีแอป C ++ และ Run โดยไม่มีการดีบักและหน้าต่างคอนโซลยังคงปิดคุณต้องจำไว้ว่าให้ตั้งค่าระบบย่อยเป็น Console อย่างชัดเจนภายใต้ Configuration Properties / Linker / System สิ่งนี้สามารถเกิดขึ้นได้หากคุณเริ่มต้นด้วยโครงการที่ว่างเปล่าซึ่งทำให้ระบบย่อยไม่ได้ตั้งค่า
เทรเวอร์โรบินสัน

4
ไม่ได้ผลสำหรับฉัน :( หน้าต่างคอนโซลจะเปิดและปิดทันที แต่บันทึกจะหยุดและรอการกด F5 เพิ่มเติม
CodyBugstein

40
คำตอบที่ถูกต้องคือคำตอบโดย @TrevorRobinson: นี่เป็นเวอร์ชั่นขยายหากคุณมีปัญหาในการค้นหาว่าคุณสมบัติการกำหนดค่าคืออะไร: คลิกขวาที่โครงการของคุณใน Visual Studio> คุณสมบัติ> คุณสมบัติการกำหนดค่า> ตัวเชื่อมโยง> ระบบเปลี่ยนระบบย่อยเป็น " คอนโซล "
PlagueHammer

3
Trevor Robinson ถูกต้อง ถ้าคุณเริ่มโครงการเปล่าและรายการ C ++ คุณต้องไปที่ View-> ตัวจัดการคุณสมบัติ -> คุณสมบัติ (ไอคอนเครื่องมือ) -> กำหนดค่า Properties-> Linker-> System-> Subsystem-> ในเมนูป๊อปอัพเลือก Console
ท่านที่เคารพมากที่สุด

10
ฉันกำลังทำงานกับชุมชน VS 2017 ctrl+f5ไม่ทำงานไม่มีPropertiesเมื่อฉันคลิกขวาโครงการและwrench iconเป็นสีเทา
Ketan

232

คลิกขวาที่โครงการของคุณ

คุณสมบัติ> คุณสมบัติการกำหนดค่า> ตัวเชื่อมโยง> ระบบ

เลือกคอนโซล (/ ระบบย่อย: คอนโซล)ในSubSystemตัวเลือกหรือคุณสามารถพิมพ์คอนโซลในฟิลด์ข้อความ!

ตอนนี้ลอง ... มันควรจะทำงาน


สิ่งนี้ใช้ได้กับ VS2013 Express ของฉัน แต่คำตอบที่ยอมรับไม่ได้ แปลกมากเนื่องจากคำตอบที่ยอมรับนั้นใช้ได้กับ Visual Studio ทุกรุ่นที่ฉันเคยใช้ในอดีต
Michael Calvin

9
@MichaelCalvin คุณต้องเรียกใช้ด้วย Ctrl + F5 หลังจากตั้งค่านี่เป็นตัวเลือก
Jonathan Mee

ตามที่ @JonathanMee ระบุว่าคุณยังคงรัน Ctrl + F5 นี่ถูกตั้งค่าไว้แล้วใน Visual Studio 2015 ของฉันดังนั้นคำตอบแรกคือคำตอบที่ช่วยได้มากที่สุด

ถูกต้องแน่นอน ความคุ้นเคยCTRL+F5จะล้มเหลวถ้าคุณพูดเพิ่มไฟล์ C ++ ใหม่ให้กับโครงการที่ว่างเปล่า
user2023370

ทำงานกับฉันใน Visual Studio Express 2015 ขอบคุณ
LHC

44

นี่คือวิธีสำหรับ C / C ++:

#include <stdlib.h>

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

ใส่นี้ที่ด้านบนของโปรแกรมของคุณและถ้ามันอยู่บนระบบ Windows ( #ifdef _WIN32) WINPAUSEแล้วมันจะสร้างแมโครที่เรียกว่า เมื่อใดก็ตามที่คุณต้องการให้โปรแกรมหยุดชั่วคราวให้โทรWINPAUSE;และมันจะหยุดโปรแกรมชั่วคราวโดยใช้คำสั่ง DOS สำหรับระบบอื่น ๆ เช่น Unix / Linux คอนโซลไม่ควรออกเมื่อออกจากโปรแกรม


วิธีนี้ใช้ไม่ได้กับ Visual C ++ (เว้นแต่คุณจะใส่หัวข้อไว้บ้าง)
wmac

2
@wmac คุณต้องรวมส่วนหัว windows.h
Geowil

1
ฉันไม่ได้รวมไลบรารีหรือเนมสเปซใด ๆ แต่ทำงานได้อย่างถูกต้องขอบคุณมาก
Halil İbrahimOymacı

1
กรุณาอย่าทำเช่นนั้น pauseคำสั่งที่ใช้ Windows ที่เฉพาะเจาะจง
firegurafiku

ทำงานกับฉันใน Visual Studio 2013 Express :)
Anirban

32

ไปที่ Debug Menu-> กด Start โดยไม่ต้อง Debug


นี่ไม่ใช่แม้แต่ตัวเลือกใน VS 2008 เว้นแต่ C # Development Environment ถูกเลือก CTRL + F5 ทำงานแม้ว่า คุณยังสามารถเพิ่มสิ่งนี้เป็นปุ่มในแถบเครื่องมือผ่านเครื่องมือ> ปรับแต่ง
เพอร์รี

หากคุณมีหลายโครงการให้ตั้งค่าโครงการที่เกี่ยวข้องเป็นโครงการเริ่มต้น
CAD bloke

27

หากคุณใช้. NET ให้ใส่Console.ReadLine()ก่อนสิ้นสุดโปรแกรม

<ENTER>มันจะรอ


9
+1 - ไม่ว่าConsole.ReadKey()จะเป็นหรือเพียงแค่รอคีย์ใด ๆ
Fredrik Mörk

แปลกนี่ไม่มีผลกับแอพของฉัน มันยังคงปิดโดยไม่ต้องรออินพุตของผู้ใช้
Kokodoko

4
จากนั้นโค้ดของคุณน่าจะจบก่อนที่จะถึงจุดนั้น
แน่นอน

20

เริ่มต้นจาก Visual Studio 2017 (15.9.4) มีตัวเลือกดังนี้:

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

ส่วนที่สอดคล้องกันจากเอกสาร Visual Studio :

ปิดคอนโซลโดยอัตโนมัติเมื่อการดีบักหยุด:

บอก Visual Studio เพื่อปิดคอนโซลเมื่อสิ้นสุดเซสชันการดีบัก


2
ฉันเพิ่งทดสอบสิ่งนี้ใน VS2017 และ VS2019 มันต้องการทั้งการตั้งค่าระบบย่อยให้เป็น CONSOLE และปิดตัวเลือกนี้ มีหนึ่งหรืออื่น ๆ หรือไม่ปิดหน้าต่างโดยอัตโนมัติ
Casey

สิ่งนี้ยังคงปิดหน้าต่างให้ฉันถ้าฉันเปิดหลายโครงการจากโซลูชันเดียวกัน
Serge Rogatch

ฉันรู้สึกว่านี่เป็นคำตอบที่ถูกต้องสำหรับ VS 2017 และส่งต่อ น่าเสียดายที่มันไม่ได้อยู่ในรุ่นที่เก่ากว่า
ความโกรธเกรี้ยวทั้งหมด

13

ลองโทรออกgetchar()ก่อนmain()ส่งคืน


ไม่ทำงานใน VS 2008 สำหรับแอปคอนโซล Hello Name แบบง่าย cout, cin, cout, getchar (), คอนโซลยังคงปิดอยู่ ตกลงคืออะไร?
เพอร์รี

1
ลองวาง getchar () สองครั้งถ้าคุณมี cout ก่อน getchar () getchar () คาดว่าจะมีถ่านแล้วและคุณกำลังให้มันกับ cout ... แจ้งให้เราทราบว่าสิ่งนี้จะช่วยได้ไหม :)
Magarusu

12

(/ ระบบย่อย: คอนโซล) ไม่ทำงานสำหรับ vs2013 ของฉัน (ฉันมีแล้ว)

"รันโดยไม่มีการดีบัก" ไม่ใช่ตัวเลือกเนื่องจากฉันไม่ต้องการสลับระหว่างการดีบักและเห็นผลลัพธ์

จบลงด้วย

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

โซลูชันที่ใช้ใน qtcreator pre 2.6 ตอนนี้ในขณะที่ qt กำลังเติบโต vs กำลังไปทางอื่น อย่างที่ฉันจำได้ใน vs2008 เราไม่ต้องการกลอุบายดังกล่าว


7

นี่คือโซลูชันที่ (1) ไม่ต้องการการเปลี่ยนแปลงหรือเบรกพอยต์ของรหัสใด ๆ และ (2) หยุดชั่วคราวหลังจากสิ้นสุดโปรแกรมเพื่อให้คุณเห็นทุกอย่างที่พิมพ์ มันจะหยุดหลังจาก F5 หรือ Ctrl + F5 อย่างใดอย่างหนึ่ง ข้อเสียที่สำคัญคือใน VS2013 Express (ดังที่ทดสอบแล้ว) จะไม่โหลดสัญลักษณ์ดังนั้นการดีบักจึงถูก จำกัด มาก

  1. สร้างแบตช์ไฟล์ ฉันเรียกฉันว่าrunthenpause.batด้วยเนื้อหาต่อไปนี้:

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

    บรรทัดแรกจะเรียกใช้คำสั่งใดก็ตามที่คุณให้ไว้และอาร์กิวเมนต์มากถึงแปดรายการ บรรทัดที่สองจะ ... หยุดชั่วคราว

  2. เปิดคุณสมบัติของโครงการ | คุณสมบัติการกำหนดค่า | แก้จุดบกพร่อง

  3. เปลี่ยน "อาร์กิวเมนต์ของคำสั่ง" เป็น$(TargetPath)(หรืออะไรก็ตามที่อยู่ใน "คำสั่ง")
  4. เปลี่ยน "คำสั่ง" runthenpause.batไปยังเส้นทางที่เต็มไปด้วย
  5. กดตกลง

ตอนนี้เมื่อคุณเรียกใช้runthenpause.batจะเปิดแอปพลิเคชันของคุณและหลังจากที่แอปพลิเคชันของคุณสิ้นสุดลงจะหยุดชั่วคราวเพื่อให้คุณเห็นเอาต์พุตคอนโซล

ฉันจะโพสต์การอัปเดตหากฉันทราบวิธีโหลดสัญลักษณ์ ฉันพยายาม/Z7ต่อนี้แต่ไม่ประสบความสำเร็จ


1
สิ่งนี้ยังคงไม่รองรับการแก้ไขข้อบกพร่อง แต่อย่างน้อยก็แก้ปัญหาที่ไม่สามารถมองเห็นผลลัพธ์เช่น VLD ตรงกันข้ามกับคำตอบอื่น ๆทั้งหมด
Martin Hennings


3

คุณสามารถเรียกใช้ไฟล์ปฏิบัติการได้จากพรอมต์คำสั่ง วิธีนี้คุณจะเห็นผลลัพธ์ทั้งหมด หรือคุณสามารถทำสิ่งนี้:

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

return YOUR_MAIN_CODE;

และวิธีนี้หน้าต่างจะไม่ปิดจนกว่าคุณจะป้อนข้อมูลสำหรับaตัวแปร


3

เพิ่ม“ | หยุด” ในกล่องอาร์กิวเมนต์คำสั่งภายใต้ส่วนการดีบักที่คุณสมบัติของโครงการ


4
นี่จะเป็นทางออกที่ดีถ้าใช้งานได้ pauseดูเหมือนจะใช้งานได้ในไฟล์แบตช์เท่านั้นและแม้ว่าจะได้รับอินพุตจากโปรแกรมของคุณบน STDIN แต่ก็ไม่ได้พิมพ์ข้อความนั้นซ้ำ ฉันพยายามแทนที่|ด้วย&&แต่มันไม่มีผลกระทบ - น่าจะเป็นเพราะมันไม่ได้ดำเนินการกับเชลล์คำสั่ง (cmd.exe)
Brian Vandenberg

3

เพียงกด CNTRL + F5 เพื่อเปิดในหน้าต่างบรรทัดคำสั่งภายนอก (Visual Studio ไม่มีอำนาจควบคุม)

หากวิธีนี้ใช้ไม่ได้ผลให้เพิ่มรายการต่อไปนี้ในตอนท้ายของรหัสของคุณ:

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

การดำเนินการนี้จะรอให้คุณกดปุ่มเพื่อปิดหน้าต่างเทอร์มินัลเมื่อรหัสถึงจุดสิ้นสุด

หากคุณต้องการทำเช่นนี้ในหลาย ๆ ที่ให้ใส่รหัสข้างต้นในวิธีการ (เช่นprivate void Pause()) และโทรPause()เมื่อใดก็ตามที่โปรแกรมมาถึงจุดสิ้นสุดที่เป็นไปได้


เมื่อฉันทำ cntrl + f5 มันเปิดขึ้นแล้วปิดทันที? คุณจะแก้ไขได้อย่างไร
Callat

ทางออกที่สองคือสิ่งที่ฉันกำลังมองหา!
RoG

เมื่อฉันกด Ctrl + F5 ไม่มีอะไรเกิดขึ้น มันเคยทำงานให้ฉัน แต่ทุกอย่างก็หยุดทำงาน
Natasha

2

ทางออกที่ดีกว่า:

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

ที่จุดเริ่มต้นของโปรแกรมของคุณ

ข้อดี:

  • สามารถใช้ std :: exit ()
  • สามารถมีผลตอบแทนหลายรายการจากหลัก
  • คุณสามารถเรียกใช้โปรแกรมของคุณภายใต้ดีบักเกอร์
  • IDE อิสระ (+ OS อิสระหากคุณใช้cin.sync(); cin.ignore();เคล็ดลับแทนsystem("pause");)

จุดด้อย:

  • ต้องแก้ไขรหัส
  • จะไม่หยุดใน std :: ยุติ ()
  • จะยังคงเกิดขึ้นในโปรแกรมของคุณนอกเซสชัน IDE / ดีบักเกอร์ คุณสามารถป้องกันสิ่งนี้ได้ใน Windows โดยใช้:

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

คำแนะนำที่แย่มาก
ไชโยและ hth - Alf

คุณอธิบายได้อย่างละเอียดว่าทำไม?
GhassanPL

ในกรณีที่ไม่มีการดีบักจะไม่มีประโยชน์เนื่องจากในกรณีนี้ไม่มีปัญหาที่จะแก้ไข ใน VS เพียงแค่เรียกใช้โปรแกรมด้วย Ctrl + F5 และนั่นคือมันจึงไม่มีปัญหาใน VS และในล่ามคำสั่งไม่มีปัญหาในระยะสั้นไม่มีปัญหา และในกรณีที่มีการดีบั๊กและต้องการหยุดเพิ่มรหัสเพื่อหยุดไม่ใช่ทางออกที่สะดวกกว่าเบรกพอยต์และรบกวนในสถานการณ์ที่ไม่มีใครอยากหยุด
ไชโยและ hth - Alf

2

ทั้งใช้:

  1. cin.get();

หรือ

  1. system("pause");

ตรวจสอบให้แน่ใจว่าได้ทำอย่างใดอย่างหนึ่งในตอนท้ายของmain()ฟังก์ชั่นและก่อนที่returnคำสั่ง



2

ในกรณีของฉันฉันพบสิ่งนี้เมื่อฉันสร้างโปรเจ็กต์ C ++ ที่ว่างเปล่าบน VS 2017 community edition คุณจะต้องตั้งค่าระบบย่อยเป็น "คอนโซล (/ ระบบย่อย: คอนโซล)" ภายใต้คุณสมบัติการกำหนดค่า

  1. ไปที่ "มุมมอง" จากนั้นเลือก "ตัวจัดการอสังหาริมทรัพย์"
  2. คลิกขวาที่โครงการ / โซลูชันแล้วเลือก "คุณสมบัติ" สิ่งนี้จะเปิดหน้าคุณสมบัติทดสอบ
  3. นำทางไปยังลิงเกอร์จากนั้นเลือก "ระบบ"
  4. คลิกที่ "SubSystem" และรายการแบบหล่นลงจะปรากฏขึ้น
  5. เลือก "คอนโซล (/ ระบบย่อย: คอนโซล)"
  6. ใช้และบันทึก
  7. ครั้งต่อไปที่คุณเรียกใช้รหัสด้วย "CTRL + F5" คุณจะเห็นผลลัพธ์

0

Visual Studio 2015มีการนำเข้า เพราะฉันเกลียดเมื่อตัวอย่างโค้ดไม่ให้การนำเข้าที่จำเป็น

#include <iostream>;

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.