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

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

#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と関連する良く見られている質問

Qfmlのconfig.phで使う、q{~};やq#~#;q%~%;は全て同じ意味?

メーリングリストのカスタマイズをしていて、ネット上で情報を集めているのですがどうしても分からないところがあります。 fml 4.0
$SMTP_OPEN_HOOKなどのHOOKを行うときに、q{~};やq#~#;q%~%を同じサイトであっても使い分けているようで、SMTP_OPEN_HOOKの時には =q{~}; を、START_HOOKでは =q#~#; のようになっています。
プログラムというもの自体触ったことはないのですが、一応記号が変わっているだけで中身は同じなのかなと思っています。
実際のところ別物でしょうか?

fmlとqで検索をかけても情報が引っかかりませんし、fmlとq#などとしてもfmlでしか検索できないみたいで八方ふさがりです。
よろしくお願いします。

Aベストアンサー

fmlはPerlという言語で書かれています。これはPerlの記法の問題です。
どれも意味は同じです。違うのは、
・囲まれた内部で使われて無い記号を使って囲むため
・書いた人が違う
・気分によって使い分け?

Qコマンドプロンプトで{ENTRE]キーの入力を求められる箇所で、自動で{ENTER}を入力されるようにしたい。

お世話になります。

コマンドプロンプトである行で、{ENTRE]キーの入力を求められる箇所がありまして、キーボードから[ENTER]ボタンを押さないと次にすすまないのです。

そのコマンドプロンプトを編集して、自動で{ENTER}を入力されるようにしたいのです。

お手数ですがなにとぞよろしくお願いします。

Aベストアンサー

c:\enterという改行キーがはいったファイルを用意しておいて

hoge.bat < c:\enter
としてみては?

Q【緊急】{ww: w∈{a, b}*}はRegular language?

{ww: w∈{a, b}*}はRegular languageですよね?
{ww^R: w∈{a, b}*}はNon-regular languageというのは知っています。

さっき試験が終わったばっかりで気になって仕方がありません。

Aベストアンサー

> という場合がありえますが
----------** 最後のa..ab、
を忘れていました。どっちにしても結論はかわりませんが、訂正します。

あと、ついでなので1つアドバイス的なことを。
正規表現の能力の限界は、直観的には、DFAが有限の状態しか持たないということに起因します。
例えば、(^i )^i(=同じ数の対応する括弧)が正規表現で表せないことはご存知ですよね。
これは、「(^i が入力された時点で、今までに何個の( が入力されたかを覚えておく必要があるが、それは有限の状態では不可能だから」と理解することができます。

こう理解しておくと、証明するまでもなく、{ww: w∈{a, b}*} は正規言語ではないということが予想できるかと思います。

Qオートマトン L = {ww^R: w ∈ {a, b}+}の中心の見つけ方

下記のようなオートマトンがあります。

L = {ww^R: w ∈ {a, b}+}
M = (Q, Σ, Γ, δ, q0, z, F)
Q = (q0, q1, q2),
Σ = {a, b},
Γ = {a, b, z},
F = {q2}.

(1)wをスタックに載せるために:
δ(q0, a, a) = {(q0, aa)}
δ(q0, b, a) = {(q0, ba)}
δ(q0, a, b) = {(q0, ab)}
δ(q0, b, b) = {(q0, bb)}
δ(q0, a, z) = {(q0, az)}
δ(q0, b, z) = {(q0, bz)}

(2)どこが文の中心か見つけるために(状態がq0からq1に変わる):
δ(q0, λ, a) = {(q1, a)}
δ(q0, λ, b) = {(q1, b)}

(3)w^Rと一致させるために:
δ(q1, a, a) = {(q1, λ)}
δ(q1, b, b) = {(q1, λ)}

(4)最後に:
δ(q1, λ, z) = {(q2, z)}

とあります。
問題の中にこれを元にしてL = {wcw^R: w ∈ {a, b}*}のnpdaをつくりなさい、
というのがありますが、それは(2)を
δ(q0, c, a) = {(q1, a)} ←cが入力されたらそこが中心
δ(q0, c, b) = {(q1, b)}
に変えて
δ(q0, λ, z) = {(q2, λ)} ←何も入力されなかったら文字を受け付ける(* → +なので)
を付け加えればよいですか? (多分、そうですよね?)

それと、上の(2)がどうやって中心を見つけているのか分かりません。
入力中は何文字入力されるかなんて分かりませんよね。
例えばbaabbaabという文があったとすると最初の四文字でbaabで
「さては中心はbaとabの間だな!」とか勘違いとかしないんですか?
入力がλということは毎回毎回入力がある度にチェックしているということでしょうか?
混乱している私に分かりやすい説明ができる方、どうかお願いします。

下記のようなオートマトンがあります。

L = {ww^R: w ∈ {a, b}+}
M = (Q, Σ, Γ, δ, q0, z, F)
Q = (q0, q1, q2),
Σ = {a, b},
Γ = {a, b, z},
F = {q2}.

(1)wをスタックに載せるために:
δ(q0, a, a) = {(q0, aa)}
δ(q0, b, a) = {(q0, ba)}
δ(q0, a, b) = {(q0, ab)}
δ(q0, b, b) = {(q0, bb)}
δ(q0, a, z) = {(q0, az)}
δ(q0, b, z) = {(q0, bz)}

(2)どこが文の中心か見つけるために(状態がq0からq1に変わる):
δ(q0, λ, a) = {(q1, a)}
δ(q0, λ, b) = {(q1, b)}

(3)w^Rと一致させるため...続きを読む

Aベストアンサー

先の2つの御質問からすると、non-deterministic(非決定的)なPDAを考えているわけですよね。

非決定的なオートマトンでは、「1つの入力系列に対して複数の遷移経路が考えられるが、そのうち1つでも受理状態で遷移が終了する経路が存在すれば、オートマトンはその入力を受理する」と考えます。

baabbaabの例であれば、"b"しか入力されていない状態、"ba"まで入力された状態、...、"baabbaab"まで入力されてしまった状態、のどこで(2)の遷移をやってもいいんです。
そのうち"baab"の状態で(2)の遷移をすれば受理状態で遷移が終了するので、このオートマトンは"baabbaab"を受理するといえるわけです。

> それは(2)を
> ....
> を付け加えればよいですか? (多分、そうですよね?)
そこはそれで合っていると思いますよ。

QザウルスSL-C860上での{}の入力

ザウルスSL-C860でJAVAのプログラムを組もうと
思っていますが、{}(波括弧)の入力の仕方が
分かりません。
結構つかうので、簡単な入力の仕方がいいのですが・・。
分かる人がいたら、お願いします。

Aベストアンサー

KeyHelperApplet等の
キー変更ソフトを使って
対応するしかないはず。

参考URL:http://yakty.s31.xrea.com/linuzau/keyhelper/


人気Q&Aランキング

おすすめ情報