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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

3449閲覧

【C#】アプリケーションが終了できない【Win32API】

aridai1221

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2016/07/05 11:24

###前提・実現したいこと
C#でWin32APIを利用してウィンドウを表示させるサンプルを作りました。
イベントループではなく、メッセージを待機しないループを発生させるようにしました。

###発生している問題・エラーメッセージ
実行は何も問題なくできたのですが、
ウィンドウを閉じてもバックグラウンドでは終了できていないようです。
バックグラウンドで残り続けることなく終了するにはどうすればいいのでしょうか。

###該当のソースコード
GitHubにあげました。
Program.cs
Win32API.cs
の2つのファイルです。

###試したこと
ウィンドウプロシージャを調べてみました。
私がデバッグしたところ、
ウィンドウを閉じたときに WM_DESTORY は取得出来ているようでした。
しかし、checkMessageメソッド内で WM_QUIT は取得できていなかったようです。

ウィンドウプロシージャ内で WM_DESTORY が投げられたときに
ちゃんと PostQuitMessage を呼び出しているので
次にcheckMessageメソッドに入ったときに
whileループを抜けてくれるはずなのですが...

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

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

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

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

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

guest

回答1

0

ベストアンサー

WM_QUITはスレッドに関連付いているメッセージなので取得できません。
PeekMessageの2番目の引数に-1を指定する事で取得できると思います。

また、PeekMessageをGetMessageに変更した方が良いです。
(GetMessageの2番目に引数は-1ではなくnull)

詳しくは、SDKのhelpを見てください。
https://msdn.microsoft.com/ja-jp/library/cc410948.aspx
https://msdn.microsoft.com/ja-jp/library/cc364699.aspx

投稿2016/07/05 12:08

編集2016/07/05 12:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aridai1221

2016/07/05 12:18 編集

回答ありがとうございます。 ゲームを作ることができるように メッセージループではなくメインループを行いたいので、 PeekMessageを使ったのですが、 なぜGetMessageのほうがいいのでしょうか。
kopio

2016/07/05 12:43

ゲームのメインループならPeekMessageで大丈夫ですよ。 前提としてゲームという話がなければ、たいていの場合はGetMessageがいいでしょう。 一番の違いはGetMessageはメッセージがないときに待機するので無駄なループをしない、 PeekMessageはメッセージがないときに待機しないのでメッセージがなくても処理を回せる。 といったところでしょうか。
退会済みユーザー

退会済みユーザー

2016/07/05 12:53

すみません、ゲームではなく普通の画面を作っているものと勘違いしていました。 アイドリングで何か処理をするのであればPeekMessageで問題ないです。
aridai1221

2016/07/05 13:02

わかりました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問