質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

245閲覧

ウインドウの[×]印を押したら終了前の処理をしたい

One_of_Arthur

総合スコア81

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/04/28 02:44

実現したいこと

VisualStudioのC++でConsoleApplicationを書いています。
ウインドウの[×]ボタンを押したときにも、通常の終了前の時と同じ処理をしたいです。
下記のソースではビープ音を「ミレド」とならしたいです。

発生している問題・分からないこと

C++超初心者の私には、そもそもC++でそのようなことが実現できるのかさえ分かりません。

該当のソースコード

C++

1#include <iostream> 2#include <conio.h> 3#include <stdio.h> 4#include <windows.h> 5 6using namespace std; 7 8int main() 9{ 10 __try 11 { 12 std::cout << "Hello World!\n"; 13 Beep(440, 200); // ド 14 Beep(494, 200); // レ 15 Beep(554, 200); // ミ 16 printf("[Enter]キーを押すと終了します。"); 17 while (true) 18 { 19 int key = 0; 20 if (GetAsyncKeyState(13) & 0x0001) { 21 break; 22 } 23 } 24 } 25 __finally 26 { 27 Beep(554, 200); // ミ 28 Beep(494, 200); // レ 29 Beep(440, 200); // ド 30 } 31}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

キーワードがよくないのか、C++でそのような記事が見つけられませんでした。
__finallyではダメなことは分かりました。

補足

Microsoft Visual Studio Community 2022
Version 17.9.6
VisualStudio.17.Release/17.9.6+34728.123

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2024/04/28 02:50

どのようなキーワードで検索されましたか? 「C++ ウインドウ 閉じる」とかで検索しても情報は得られました。
guest

回答1

0

ベストアンサー

Windows 11、Visual Studio 2022で確認しました。

参考
https://learn.microsoft.com/en-us/windows/console/registering-a-control-handler-function

#include <iostream> #include <conio.h> #include <stdio.h> #include <windows.h> using namespace std; void miredo() { Beep(554, 200); // ミ Beep(494, 200); // レ Beep(440, 200); // ド } int WINAPI CtrlHandler(unsigned long fdwCtrlType) { switch (fdwCtrlType) { // [X]ボタン case CTRL_CLOSE_EVENT: miredo(); return true; default: return false; } } int main() { std::cout << "Hello World!\n"; Beep(440, 200); // ド Beep(494, 200); // レ Beep(554, 200); // ミ if (SetConsoleCtrlHandler(CtrlHandler, true)) { printf("[Enter]キーを押すと終了します。"); while (true) { int key = 0; if (GetAsyncKeyState(13) & 0x0001) { break; } } } miredo(); }

投稿2024/04/28 05:07

hiroki-o

総合スコア519

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

One_of_Arthur

2024/04/28 08:20

回答ありがとうございます。 試したところ問題が解決しました! 本番用のソースに組み込みも、ちょっと試行錯誤しましたが無事に動きました。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問