人に聞けない痔の悩み、これでスッキリ >>

プログラム初心者です。よろしくお願いします。

フォームアプリケーションで入門としてクリックやウィンドウの検知を行うプログラムを書いてみたのですが、右上の閉じるボタン[×]を押すとウィンドウは閉じますが、デバックは終了しません。
プロセスを見てもプロジェクト名のプロセスは残ったままで、デバッグを手動で停止させると消えます。
これはこういうものなのでしょうか?
初めて書いたプログラムなので比較対象が無くて分かりません。

以下プログラムコード
project1
------------------------------------------
(略)

protected: virtual void WndProc(System::Windows::Forms::Message% m) override
{
switch(m.Msg)
{
case WM_TIMER:
if(m.WParam.ToInt32()==1)
{
POINT point;
GetCursorPos(&point);
Form1::label2->Text="X:"+point.x;
Form1::label3->Text="Y:"+point.y;

setlocale( LC_ALL, "Japanese" );
TCHAR buff[260];
HWND hWnd;
hWnd=WindowFromPoint(point);
GetWindowText(hWnd, buff, sizeof(buff));
Form1::label1->Text=gcnew String(buff);
}break;

case WM_MOVE:
Form1::label4->Text="移動しました。";break;

case WM_LBUTTONDOWN:
Form1::label4->Text="左クリック";break;

case WM_RBUTTONDOWN:
Form1::label4->Text="右クリック";break;

/*default:
Form1::label4->Text=m.Msg.ToString();break;*/
}
Form::WndProc(m);
}


private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
HWND hmyWnd = static_cast<HWND>(this->Handle.ToPointer());
SetTimer(hmyWnd,1,100,NULL);
}

};
-------------------------------------------------------------

また、case WM_RBUTTONDOWN:の内部にClose();を書き足して実行すると
「'System.ObjectDisposedException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。」
と出ます。


何かおかしいところはありますでしょうか?
それとも仕様でしょうか?
お教えくださいm(_ _)m

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

A 回答 (3件)

以下のようにイベントハンドラが記述されるので・・・ってWM_MOVEでしたね・・・。



上記コードに、WM_MOUSEMOVE通知時のコードがあったとしたらそれをイベント
ハンドラに記述します。

という感じで、夫々の処理をイベントハンドラに書いても起きますか?
「閉じるを押してもデバッグが終了しません。」の回答画像3
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
画像付の説明恐れ入ります。イベントハイドラについてはそういうのがあるということは知っていましたが作ったことは無かったので参考になりました。
早速実装してみたところ、正常にデバッグが終了いたしました。
ウィンドウプロシージャがいけないようですね。

ですが私が今後実装したいと考えているプログラムは、グローバルフックを使い他のプログラム(FireFoxなど)のWM_MOVEを取得したいと考えています。
そのため今回はメッセージの扱いを学ぶためにウィンドウプロシージャを使用しました。

今後もこの分野で何度か質問をさせていただく事があると思います。その時はまたぜひ助けていただければ幸いです。

今回は本当にありがとうございます。

お礼日時:2012/06/26 00:40

次に、プロパティーウィンドウの稲妻マークをクリックしてください。

 ← (1)
次に、MouseMoveをダブルクリックしてください。 ← (2)
「閉じるを押してもデバッグが終了しません。」の回答画像2
    • good
    • 0

コード見ただけでは、正しい様な気がしますね。



ただ、なぜ、WndProcをオーバーライドするという方法を選んだんですか?
上記の事をやりたいだけならイベントハンドラを書いたらいいだけなんではないでしょうか?

一応、ご存知かもしれませんが、イベントハンドラの追加の仕方を紹介しておきます。

まず、下記画像にある様にメニューからプロパティウィンドウを表示させてください。
「閉じるを押してもデバッグが終了しません。」の回答画像1
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC# 別なフォームへ値を渡す (初心者です)

メインのフォームからサブのフォームを呼び出して、
サブのフォ-ムからさらにクラスを呼び出し、
クラスからメインのテキストボックスのテキストに書き込むプログラムを作成中です。

ですが、テキストボックスがパブリックにも関わらず、表示されません。
デバックで見る限り、テキストボックスのテキストには値が入っているのですが、
フォームを見ると表示されていません。

知恵をお貸しください。

Aベストアンサー

普通にメソッドに変数を渡すのと一緒の感じでいいですよ。
例えば、フォームのコンストラクタに渡す感じで。
A_Form : メインフォームの型
B_Form : サブフォームの型
C_Form : 子フォームの型
とします。
class B_Form : Form
{
 private A_Form main_form;
 public B_Form(A_Form a)
 {
  main_form = a;
 }
}

class C_Form : Form
{
 private A_Form main_form;
 public C_Form(A_Form a)
 {
  main_form = a;
 }
}

public void some_function()
{
 A_Form a = new A_Form();
 B_Form b = new B_Form(a);
 C_Form c = new C_Form(a);
}

といった感じになるかと。
最後のメソッドはたとえばなので、参考程度に。

http://www.stackasterisk.jp/tech/dotNet/csharp02_01.jsp

普通にメソッドに変数を渡すのと一緒の感じでいいですよ。
例えば、フォームのコンストラクタに渡す感じで。
A_Form : メインフォームの型
B_Form : サブフォームの型
C_Form : 子フォームの型
とします。
class B_Form : Form
{
 private A_Form main_form;
 public B_Form(A_Form a)
 {
  main_form = a;
 }
}

class C_Form : Form
{
 private A_Form main_form;
 public C_Form(A_Form a)
 {
  main_form = a;
 }
}

public void some_function()
{
 A_Form a = new A...続きを読む

QDataTableに特定のフィールドが存在するかどうか調べるには?

DataTableに登録されているフィールドに、特定のフィールドが存在しているかどうか調べるには、どのようにすればよいでしょうか?

dtTable.Columns.Add("TEST1")
dtTable.Columns.Add("TEST2")

dtTableにTEST1とTEST2のフィールドが登録されていたとして、

Dim tmp As String = dtTable.Rows(0).Item("TEST3"),ToString

TEST3のフィールド名で値を取得しようとすると、TEST3の列が登録されていない為、エラーとなります。

そこで、事前にTEST3というフィールドが、DataTableに存在するかどうか調べたいのです。
(ハッシュテーブルのContainsKeyメソッド等のようなものを求めています)
お分かりになる方がいましたら、宜しくお願いします。

Aベストアンサー

DataColumnCollection.Contains メソッド
http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumncollection.contains(VS.80).aspx
を使用すればよいと思います。

ちなみに、DataTable.Columns が DatacolumnCollection クラスです。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qc#で他のアプリをアクティブにする方法

初心者の質問ですがよろしくお願いします。

現在作成中のアプリは他のアプリのフォームに文字を入力するものですが、
他のアプリに文字を入力する際、該当のアプリをアクティブにする必要があります、そこであるページを参考にして以下のコードによってアクティブにできる事がわかりました。
Interaction.AppActivate("Outlook Express");
(※今回の例ではアウトルックエクスプレスをアクティブにしている)

しかし、いざ実行しようとしてみると
「名前Interactionは現在のコンテキスト内に存在しません」というエラーが出てしまいます。

Interaction.AppActivateの前に何か付け足さなくてはいけないのでしょうか?
初歩的な部分で間違ってる気がします。

「Activate;」も試してみましたが同じエラーが出てしまいます、
どなたか解決法を教えてくださいよろしくお願いします。

Aベストアンサー

 こんばんは。

(1)「ソリューションエクスプローラー」の「参照設定」ツリーを右クリック。
(2)「参照の追加」を選択。
(3)「.NET」タブの状態で、リストから「Microsoft.VisualBasic 8.0.0.0」を探し出してダブルクリック。
(4)ソースの一番上に

 using Microsoft.VisualBasic;

 と書いて、

 Interaction.AppActivate("Outlook Express");

 と書くか、

 Microsoft.VisualBasic.Interaction.AppActivate("Outlook Express");

 と書くか。

 ではないでしょうか。

QビジュアルC++でボタンの有効/無効

ビジュアルC++でプログラミングをしているのですが、ツールから貼り付けたボタンの有効/無効を操作したのですが、何度やっても成功しません><、


ネットで検索した結果
CWnd* myWnd = GetDlgItem(IDC_MYEDIT);
myWnd->EnableWindow(TRUE);

でできると書いてあるのですが、どのサイトの物を使用してもビルドできませんでした(;ロ;)

どなたか原因がわかるかた、ご教授くださいm(__)m

Aベストアンサー

みているサンプルは
「Windows フォームアプリケーション」
で作成したプロジェクト用のものではありません。

どのタイミングで有効・無効を切り替えるかわかりませんが、
Enabledプロパティで変更できませんか?

this->button1->Enabled = false; // 無効

Control::Enabled プロパティ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.enabled.aspx


人気Q&Aランキング