C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ブレーク中のウィンドウメッセージはどこへ?


(過去ログ 95 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■56575 / inTopicNo.1)  ブレーク中のウィンドウメッセージはどこへ?
  
□投稿者/ デザパタ (34回)-(2011/01/20(Thu) 13:49:21)

分類:[C/C++] 

環境
 Windows Vista
 VisualStuido 2010

以下のソースはボタンを左クリックすると終了するプログラムです。
(1)の場所にブレークを仕込んで左クリックするとブレークに引っかかるわけですが、
その後ボタンのUPを検出できず、プログラムが終了しません。

ウィンドウメッセージはキューに入っており、GetMessage()しない限りなくならないと考えると
そもそもUPのメッセージが発生していないと考えるのが正しいのでしょうか?
この辺の仕組みがデバッグの際どうなっているのかわからないので教えて頂けないでしょうか?

ちなみに、C#等でWindows Formsアプリを作ってボタンにDownとUpのイベントハンドラをくっつけて同様の実験を行った場合、
Upが引っかかります。
これは.NET Frameworkがなんかうまいことやってくれてるんでしょうか?

#include<windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	HWND hwnd;
	MSG msg;

	hwnd = CreateWindow(
			TEXT("BUTTON") , TEXT("押す") ,
			WS_CAPTION | WS_VISIBLE ,
			100 , 100 , 200 , 200 , NULL , NULL ,
			hInstance , NULL
	);

	if (hwnd == NULL) return 0;
	
	while (TRUE) {
		int lup = 0;
		int ldown = 0;
		GetMessage(&msg , NULL , 0 , 0);
		if (msg.message == WM_LBUTTONDOWN)
		{
			lup = 1; // (1)
		}
		else if(msg.message == WM_LBUTTONUP) 
		{
			ldown = 1;
		}
		DispatchMessage(&msg);
		if(ldown){
			break;
		}
	}
	return 0;
}

引用返信 編集キー/
■56587 / inTopicNo.2)  Re[1]: ブレーク中のウィンドウメッセージはどこへ?
□投稿者/ nori (1回)-(2011/01/20(Thu) 22:06:39)
>ウィンドウメッセージはキューに入っており、GetMessage()しない限りなくならないと考えると
>そもそもUPのメッセージが発生していないと考えるのが正しいのでしょうか?
マウスを離した時のカーソル上にいるウィンドウに対してメッセージは発生します。

>ちなみに、C#等でWindows Formsアプリを作ってボタンにDownとUpのイベントハンドラをくっつけて同様の実験を行った場合、
>Upが引っかかります。
>これは.NET Frameworkがなんかうまいことやってくれてるんでしょうか?
マウスキャプチャーしているからでしょう。


引用返信 編集キー/
■56600 / inTopicNo.3)  Re[2]: ブレーク中のウィンドウメッセージはどこへ?
□投稿者/ デザパタ (35回)-(2011/01/21(Fri) 09:33:50)
No56587 (nori さん) に返信
> マウスキャプチャーしているからでしょう。

なるほど、こういうことができるんですね。
noriさんありがとうございます。
解決済み
引用返信 編集キー/
■56603 / inTopicNo.4)  Re[3]: ブレーク中のウィンドウメッセージはどこへ?
□投稿者/ デザパタ (36回)-(2011/01/21(Fri) 10:23:50)
なるほどと思ったのもつかの間、問題発生です。
http://wisdom.sakura.ne.jp/system/winapi/win32/win45.html
をに載っているプログラムを実行してマウスキャプチャーの動作は確認できたんですが、

以下のようにしてもWM_LBUTTONUPを検知できません。
※(1)でブレークしたときの話です。

if (msg.message == WM_LBUTTONDOWN)
{
	lup = 1; // (1)
	SetCapture(msg.hwnd);
}
else if(msg.message == WM_LBUTTONUP) 
{
	ldown = 1;
	ReleaseCapture();
}


引用返信 編集キー/
■56604 / inTopicNo.5)  Re[4]: ブレーク中のウィンドウメッセージはどこへ?
□投稿者/ デザパタ (37回)-(2011/01/21(Fri) 10:44:11)
デバッガがSetCapture or ReleaseCaptureしちゃって上のプログラムでキャプチャーしたウィンドウのこと忘れちゃってるのかなぁとか思ってたり・・・。

とりあえず、
上記プログラムのループの中で以下のように処理をすればWM_LBUTTONUPが検知できるので目的の動きは実現できます。
if(ldown){
	PostMessage(msg.hwnd, WM_LBUTTONUP, NULL, NULL);
}

疑問は解決してないので解決済みはつけないで起きます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -