下記のプログラムを実行してウィンドウを閉じるボタンで閉じると、
ウィンドウは消えるのですがなぜかプロセスが残ってしまいます。

正直、お手上げなので教えて頂けると幸いです。
よろしくお願いします。

#include<windows.h>

#define APP_NAME TEXT("Sample_MainWindow")

/*ウィンドウプロシージャ*/
LRESULT CALLBACK WindowProc(
HWND hWnd, UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

/*基本的なメッセージの処理*/
return DefWindowProc(hWnd, uMsg,wParam,lParam);

}

/*WinMain*/
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow)
{
HWND hWnd;
WNDCLASS wc;
MSG msg;

wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc= DefWindowProc;
wc.cbClsExtra= 0;
wc.cbWndExtra= 0;
wc.hInstance= hInstance;
wc.hIcon= LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor= LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground= (HBRUSH)COLOR_BACKGROUND + 1;
wc.lpszMenuName= NULL;
wc.lpszClassName= APP_NAME;

if (!RegisterClass(&wc)){
MessageBox(NULL,TEXT("ウィンドウクラスの作成に失敗しました"),NULL,MB_OK);
return 0;
}

hWnd = CreateWindow(
APP_NAME, TEXT("Window Title"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL
);

if(hWnd == NULL){
MessageBox(NULL,TEXT("ウィンドウの生成に失敗しました"),NULL,MB_OK);
return 0;
}

/*メッセージループ*/
while(GetMessage(&msg, NULL,0,0)){
DispatchMessage(&msg);
}

return (int)msg.wParam;
}

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まぁ、私もそういうメッセージループ書いたような気がしますけども……



http://msdn.microsoft.com/ja-jp/library/cc364699 …
より……
>警告 GetMessage 関数は、0 以外の値、0、-1 のいずれかを返します。したがって、次のようなコードは避けてください。
>while (GetMessage(lpMsg, hWnd, 0, 0)) ...
>このようなコードを作成すると、GetMessage 関数が失敗して -1(0xFFFFFFFF、つまり TRUE)が返った場合、ループが持続し、致命的なアプリケーションエラーを発生させる可能性があります。

とのことなので…GetMessage()がなにを返却しているか確認してみてはどうですかね?


って、見直してたら…このウィンドウプロシージャ、使われていないじゃないですか。
WM_DESTROYもDefWindowProc()が処理しているので…WM_QUITが飛んでこないんじゃないかと。
>wc.lpfnWndProc= DefWindowProc;
で自前のウィンドウプロシージャ使わん!と設定していますし。
    • good
    • 0

wc.lpfnWndProc= DefWindowProc;


これを
wc.lpfnWndProc= WindowProc;
にしてみたらどうかな?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIE5.2で「予期しない理由で終了しました」と

Macを使っている友達から私のwebをみたら「予期しない理由で終了しました」とでるよ。と言われ見てみたらその通り「予期しない理由で終了しました」になってしまいました。
なぜでしょうか?
ご教授願います。

Aベストアンサー

 普遍的な回答として、ますはあなたのご友人とやらがお使いのIE自体がおかしくなっている可能性があります。

 IE以外ではどうでしょうか。Safariでは? Firefoxでは?
 これらでも同様の症状が出るなら、IEだけでなくシステム自体がおかしくなっている可能性も否定出来ません。

 あるいは、あなたのHPにFlashやMPEGなどの動的コンテンツが置かれていて、それらをブラウザで読み込もうとするとIEが落ちるとか。
 こんな場合は対応するプラグインがおかしくなっている可能性もあります。

 "全くお役に立てなくて申し訳ありません。”

Qバッチファイル終了時にウィンドウを閉じる

超初心者です。
バッチファイルを終了時にDOSのウィンドウを閉じるという方法は
このページを見てできたのですが、
そのバッチファイルを社内のイントラネットのページに掲載し、
そのリンクをクリックし、「この場所からプログラムを上記のプログラムを実行する」にするとプログラム終了後もDOSのウィンドウが残ったままになってしまいます。
ページから実行せずにバッチファイルを直接実行するとウィンドウは
プログラム終了後閉じます。
IEのバージョンが5.0以下だとどうもそうなるような感じです。
どうすれば、ページのリンクから実行しても確実にDOSのウィンドウを終了することができるでしょうか?
どなかたご存知の方いらっしゃいましたら教えてください。

Aベストアンサー

バッチファイルのサイトにexitコマンドを実行すれば、そのウィンドウは閉じますが、それでもいいのでしょうか?

間違いがありましたらご指摘ください。
ではでは☆

Q「ダウンタウンのごっつええ感じ」が終了した理由は?

「ダウンタウンのごっつええ感じ」って急に終了しちゃいましたよね?
理由をご存知の方いらっしゃいましたら教えて下さい。
宜しくお願いします。

Aベストアンサー

フジTVが、「ごっつ」のスペシャルをヤクルトがセ・リーグ優勝を決めた試合に松本に報告無しに変更しました。
これに対し、松本人志は「今回(放送の差し替え)の件で番組に対するボルテージが下がり、100%意欲的に取り組めない。」と怒りました。
そして、ダウンタウンの所属事務所である吉本興業と、フジが協議した結果、松本の意向を受け、番組終了を決定しました。

私もこの番組大好きだったんですが・・・残念な事でしたね。

Qスレッド内でコントロールやWin32APIを使うには?

スレッド内でコントロールやWin32APIを使うには?

メールソフトを開発中にまたつまづいた事があったので質問します。
現状のプログラムでは単一スレッド上に書いているメールの受信
コードなのですが、これだとメール受信中にフォームをさわると
応答なしになってしまうので、スレッドとして受信コードを移動しようと
思って実験してみたのですが、コントロールを呼び出す部分で
例外が発生してしまい、どうすれば良いのかが分かりません。

少し調べてみたのですが、内容がよく分かりませんでした。
動かしたいのはプログレスバーとFlashWindowのAPIです。
notifyはなぜか問題なく動いていました。

開発環境はVisualStudio2005のC#(.NET2.0)です。

以下に簡略化したコードを載せます。

int mailCount = 0; // 未受信メール件数

try
{
// POPサーバの認証処理が入ります

// メール件数が1件以上の場合
if(pop.Count >= 1){
// プログレスバーを表示して最大値を未受信メール件数に設定する
// 以下のコードで例外が発生する
progressMail.Visible = true;
progressMail.Minimum = 0;
progressMail.Maximum = pop.Count;
}
else{
// 0件の場合はPOP3から切断する
pop.Close();
return;
}

// 取得したメールをコレクションに追加する
for(int no = 1; no <= pop.Count; no++){
// 受信したメールを配列に格納します

// メールの受信件数分増加させる
// 以下のコードで例外が発生する
progressMail.Value = no;
}

// メール受信後プログレスバーを非表示に戻す
// 以下のコードで例外が発生する
progressMail.Visible = false;

// POP3から切断する
pop.Close();

// 未受信メールが1件以上の場合
if(mailCount >= 1){
if(this.WindowState == FormWindowState.Minimized && Mail.minimizeTaskTray == true && Mail.autoMailFlag == true){
notifyIcon1.BalloonTipIcon = ToolTipIcon.Info;
notifyIcon1.BalloonTipTitle = "新着メール";
notifyIcon1.BalloonTipText = mailCount + "件の新着メールを受信しました。";
notifyIcon1.ShowBalloonTip(300);
}
else{
// 画面をフラッシュさせる
// 以下のコードで例外が発生する
FlashWindow(this.Handle, false);
}
}
else{
// ステータスバーに状況表示する
return;
}
}
catch (nMail.nMailException nex)
{
// ステータスバーにエラー状況表示する
return;
}
catch (Exception exp)
{
// ステータスバーにエラー状況表示する
return;
}

スレッド内でコントロールやWin32APIを使うには?

メールソフトを開発中にまたつまづいた事があったので質問します。
現状のプログラムでは単一スレッド上に書いているメールの受信
コードなのですが、これだとメール受信中にフォームをさわると
応答なしになってしまうので、スレッドとして受信コードを移動しようと
思って実験してみたのですが、コントロールを呼び出す部分で
例外が発生してしまい、どうすれば良いのかが分かりません。

少し調べてみたのですが、内容がよく分かりませんでした。
動かしたい...続きを読む

Aベストアンサー

#2,3です。

> 破棄されたオブジェクトにアクセスできません。
すみません。#3のサンプルには別スレッドが実行中に
ウインドウが閉じられた時の処理を書いていませんでした。

この例外は、
・ウインドウが閉じられてFormオブジェクトが破棄される。
 このとき別スレッドは動いたまま
・別スレッドからFormのInvokeが呼ばれるけれどFormはもう無い
ということが起こったのだと思われます。

対策としては、Form.FormClosingイベントを拾い、
Formが閉じられるときにスレッドが実行中なら
手動で中断なり終了するまで待機させてやればいいかと思います。

例えば#3に追加するなら
class MyForm : Form {
volatile bool threadContinueFlg;
Thread workerThread;

public MyForm() {
FormClosing += new FormClosingEventHandler(MyForm_FormClosing);
// 略
}

void goButton_Click(object sender, EventArgs e) {
threadContinueFlg = true;
workerThread = new Thread(new ThreadStart(DoWork));
workerThread.Start();
}

void DoWork() {
while(threadContinueFlg && ++cnt <= 0) { /* 略 */ }
}

void MyForm_FormClosing(objecr sender, FormClosingEventArgs e) {
if (workerThread != null && workerThread.IsAlive) {
threadContinueFlg = false;
while(workerThread.IsAlive) Application.DoEvents();
}
}

# どんな方法で別スレッドを作っているかわかりませんが
# System.ComponentModel.BackgroundWorkerを使った方が
# いい気がします。
# 安全にスレッドを中断できるので。

#2,3です。

> 破棄されたオブジェクトにアクセスできません。
すみません。#3のサンプルには別スレッドが実行中に
ウインドウが閉じられた時の処理を書いていませんでした。

この例外は、
・ウインドウが閉じられてFormオブジェクトが破棄される。
 このとき別スレッドは動いたまま
・別スレッドからFormのInvokeが呼ばれるけれどFormはもう無い
ということが起こったのだと思われます。

対策としては、Form.FormClosingイベントを拾い、
Formが閉じられるときにスレッドが実行中なら
手動で中断なり終了する...続きを読む

Qオークションを早期終了する理由

初めまして。先日の事なんですが私はある商品に入札していました。
どうしても手に入れたい商品だったんですがあと残り後1日という時点で出品者が出品をキャンセルしてしまいました。一応理由として家族の事情でどうのこうのということでしたがこちら側としましてはかなり凹みました。早期終了ありとなっていたんで仕方がないのかもしれませんがこういうのってつらくないですか?どんな事情であれ出品したからには出来るだけ最後まで出品してもらいと思うのですが。
私もこれまでに出品経験は何度もありますが早期終了したことはありません。そこで早期終了したことある方にお聞きしたいのですがどんな理由で早期終了されましたか?入札があまりなく自分が希望していた金額に達していなかったからというような方もおられるようですがぶっちゃけで構いませんのでぜひ経験談あれば教えて頂けないでしょうか。
ぜひ宜しくお願い致します。

Aベストアンサー

こんにちわ。私も結構オークションを活用させてもらってるひとりです。
早期終了あり、と書かれているのなら出品者側の都合でキャンセルしてもぜんぜんおかしくないと思いますよ?
もし入札者がいて、それでもキャンセルしたとしても、その負担(いくらだったかな?)は出品者が払わないといけないのですし。
私も欲しい商品を突然終了されたりしたことは何度かありますが、
そのときはどうしても諦めきれないときは、その出品者様が、他にも商品を出品しているのでしたら、
そちらのほうの”質問”のところで、『こちらの出品物への質問ではなく、申し訳ないのですが、先日、出品されていた○○の件ですが”早期終了”されたようですが、どうしても欲しいので譲ってもらえないでしょうか?』等と、交渉してみてはどうでしょうか?
まだ売る意思をお持ちでしたら、値段の交渉をしてもらえると思いますよ^^
あまりに安すぎる値段でしたら断られるでしょうが・・・^^;
払ってもいい、と思われる金額まで粘ってみては?
出品者様の希望があまりに高すぎれば、それはそれであきらめもつくでしょうし^^

こんにちわ。私も結構オークションを活用させてもらってるひとりです。
早期終了あり、と書かれているのなら出品者側の都合でキャンセルしてもぜんぜんおかしくないと思いますよ?
もし入札者がいて、それでもキャンセルしたとしても、その負担(いくらだったかな?)は出品者が払わないといけないのですし。
私も欲しい商品を突然終了されたりしたことは何度かありますが、
そのときはどうしても諦めきれないときは、その出品者様が、他にも商品を出品しているのでしたら、
そちらのほうの”質問”のところで...続きを読む

Q久しぶりにEXCELVBAプログラムをしたのですが、作成したマクロがマクロの実行ボタンを押してもそこに表示されません

題名どおりなんですが、ExcelVBAでマクロを組んで、マクロをいざ実行しようとExcelのマクロ実行のボタンを押したのですが、作ったマクロ名が表示されません。以前に個人用マクロブックのPersonal.xlsで作成したマクロは表示されています。

どうすれば、解決されるでしょうか??

Aベストアンサー

> 作ったマクロ名が表示されません。
Private Sub ...
と書いているとか、
モジュールの先頭に
Option Private Module
が書いてあるとか、
引数があるとか。

Qmac osアプリケーション”dotmacsynccllent"は予期しない理由で終了しました 

mac os xを使い始めていますが、いつの頃か「アプリケーション”dotmacsynccllent"は予期しない理由で終了しました。mac os xと他のアプリケーションには影響しません。」というエラーメッセージが出るようになりました。
この予期しない理由とは何でしょうか?
また予期せぬ理由に対処方法はありますか?
さらにこのエラーメッセージを放置していても良いのでしょうか?
放置していた場合何か不都合なことが起きるのでしょうか?
詳しいアドバイスが頂ければ幸いです。

Aベストアンサー

システム環境設定>.Mac>iDiskで「iDisk Sync :」が入になっていませんか?
これは、.Macのストレージサービス「iDisk」の内容を、Macintoshのハードディスクに同期させるものです。iDiskの読み書きは、遅くて不評で、それをカバーするために考えられたものです。表向きはiDiskを読み書きしているように見せて、じつは内蔵ハードディスク内で読み書きし、裏側であとでゆくりiDiskに転送しようというもの。この「あとでゆっくり」をやっているのが、dotmacsynccllentです。
iDiskをひんぱんに使用するのでなければ、この設定を切にしておくと、dotmacsynccllentは起動しません。起動しなければ、「予期しない理由で終了」することもなくなります。

Q32ビットプログラムを64ビットプログラムにしたい

32ビットのアプリケーション(EXE)を、
64ビットのアプリケーション(EXE)に変換することはできませんか?

Aベストアンサー

EXEを変換することは不可能。
EXEを作るときのコンパイラを64ビット対応にする必要がある。

Qパチンコでは、ボーナスが終了するたびにメーカーのロゴが表示されますが、何か理由があるのですか? 規定

パチンコでは、ボーナスが終了するたびにメーカーのロゴが表示されますが、何か理由があるのですか?
規定とか?

Aベストアンサー

「この台は、うちのメーカーが製造しました!」と言う「ただの宣伝」。

QWin32、Win64どっちを覚えるべき?

WindowsAPIの勉強をしたいと思っているのですが、Win64だけを学べば充分なのでしょうか?
それともWin32の方をやってからWin64をやった方が習得しやすい、APIの仕組みが分かるというような何かしらの利点があるのでしょうか?
ご回答よろしくお願いします

Aベストアンサー

Win64APIはWin32APIの拡張と考えていいのでWin32APIをやってプラスアルファーとしてWin64API部分をやればいい。


>現在の市販PC付属のWindowsは全てが64bitと言えるほどです。
大嘘つくなww
Windowsタブレットにはまだまだ32bit版を利用しているのが大量にある。


人気Q&Aランキング

おすすめ情報