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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

4584閲覧

メッセージの値が取得できず、メッセージボックスが反応しない

eisaku123

総合スコア74

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/05/22 00:53

いつもお世話になります。

古い VC++6.0を使ってまして
Windowプログラムのメインループのところで
メッセージに対してメッセージBOXを反応させようとしても
反応しません。下記のようにいろいろなパターンでためしましたが
うまくいかないです。どうしてでしょうか?

PreTranslateMessage(&message)を使うとよいとの情報がありますが
それを使うのでしょうか。

どうかご教授お願いします。

C++

1while( h_Run) 2{ 3 MSG message; 4 5 if (::GetMessage(&message, NULL, 0, 0)) 6 { 7 8 if((UINT)message.wParam==WM_LBUTTONUP) 9 { 10 AfxMessageBox("左クリック1"); 11 } 12 if((UINT)message.message==WM_LBUTTONUP) 13 { 14 AfxMessageBox("左クリック2"); 15 } 16 17 if((UINT)message.lParam==WM_LBUTTONUP) 18 { 19 AfxMessageBox("左クリック3"); 20 } 21 22 if(message.wParam==WM_LBUTTONUP) 23 { 24 AfxMessageBox("左クリック4"); 25 } 26 if(message.message==WM_LBUTTONUP) 27 { 28 AfxMessageBox("左クリック5"); 29 } 30 31 if(message.lParam==WM_LBUTTONUP) 32 { 33 AfxMessageBox("左クリック6"); 34 } 35 36 //PreTranslateMessage(&message); //メッセージの変換前処理 37 ::TranslateMessage(&message); //メッセージの変換 38 ::DispatchMessage (&message); //メッセージの分配=コールバックの実行 39 40 if((UINT)message.wParam==WM_LBUTTONUP) 41 { 42 AfxMessageBox("左クリック8"); 43 } 44 if((UINT)message.message==WM_LBUTTONUP) 45 { 46 AfxMessageBox("左クリック9"); 47 } 48 49 if((UINT)message.lParam==WM_LBUTTONUP) 50 { 51 AfxMessageBox("左クリック10"); 52 } 53 54 if(message.wParam==WM_LBUTTONUP) 55 { 56 AfxMessageBox("左クリック11"); 57 } 58 if(message.message==WM_LBUTTONUP) 59 { 60 AfxMessageBox("左クリック12"); 61 } 62 63 if(message.lParam==WM_LBUTTONUP) 64 { 65 AfxMessageBox("左クリック13"); 66 } 67 68 } 69 70 } 71 return FALSE; 72 73}

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

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

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

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

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

dodox86

2018/05/22 01:54

AfxMessageBoxが出てきていると言うことはMFCをお使いでしょうか。そうであると事情は複雑になります。
eisaku123

2018/05/22 01:57

Microsoft Visual Studio 6.0 を使っています。
dodox86

2018/05/22 01:59

いえ、Visual Studio 6.0 でWindowsプログラムを造るときに、Win32APIだけを使うようにしているのか、それともMFCを使っているのか、と言う意味です。
eisaku123

2018/05/22 02:02

MFCを使っているかわかりませんが、 dllは使ってます。
eisaku123

2018/05/22 02:12

サンプルなのでどう判断したらよいのでしょうか
eisaku123

2018/05/22 02:22

StdAfx.hをみるとafxwin.h などが書かれています。
dodox86

2018/05/22 02:27

ではMFCを使っています。自分で造ったメッセージループは意図通り動作しません。このプログラムの目的はなんでしょうか。マウスクリックでメッセージボックスを出すことですか。また、残念ですがVisual Studio 6.0 をお使いと言うのもちょっとアドバイスを得づらいと思います。
eisaku123

2018/05/22 02:33

目的は、「マウスクリックでメッセージボックスを出すことです」Visual Studio 6.0だとおっしゃるとおり得ずらいと思います
dodox86

2018/05/22 03:14

回答しましたので、そちらをご覧ください。
eisaku123

2018/05/22 04:46 編集

ありがとうございます。確認できました。すみませんPreTranslateMessage(&message)で実現することは可能でしょうか?while( h_Run)のなかでです。
dodox86

2018/05/22 04:50

PreTranslateMessage()の目的が違うのでは?主にキー入力に影響するAPIだった気がします。 使うことで今と挙動は変わるかもしれませんが、いずれにせよ、もともと提示されたコードに 疑問がありますので、すみませんが私の方で動作を保証することはできないです。
dodox86

2018/05/22 05:33

ああ、おっしゃりたい意味が分かりました。MFCのCWnd::PreTranslateMessage()でオーバーライドして使えば目的を実現できるか、と言う意味ですね。だとしてもちょっと使い方が違う気がします。
guest

回答2

0

もともとご提示のコードはMFCを使っていて、そうですと自前のメッセージループは意図とおりに動作させることは困難です。また、ある程度はWin32アプリケーションとMFCでの造り方を理解していないと対応は難しいかと思います。と言いますか、MFCであればCWnd::OnLButtonDown等のメンバー関数を利用します。自前のメッセージループの中で色々するようなことはしません。

目的は「マウスクリックでメッセージボックスを出すこと」と言うことですので、Win32 APIだけで実装した例を示します。※EternalWindows様のサイト、次のページのサンプルコードをひな型として流用させていただいています。(どうもありがとうございます) 基礎 / 基本コード

プログラムを起動すると、ウィンドウが表示されます。マウスの右、左ボタンを押下するとMessageBoxでメッセージを表示します。Visual Studio 6.0 でビルドして、Windows XPで動くことを確認しました。プロジェクトの新規作成で、「Win32 Application」「単純なWin32アプリケーション」でひな形をつくって貼り付けるなどしてください。

stdafx.hは、ウィザードで作られたものそのままです。

C++

1// stdafx.h : 標準のシステム インクルード ファイル、 2// または参照回数が多く、かつあまり変更されない 3// プロジェクト専用のインクルード ファイルを記述します。 4// 5 6#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) 7#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ 8 9#if _MSC_VER > 1000 10#pragma once 11#endif // _MSC_VER > 1000 12 13#define WIN32_LEAN_AND_MEAN // Windows ヘッダーから殆ど使用されないスタッフを除外します 14 15#include <windows.h> 16 17 18// TODO: プログラムで必要なヘッダー参照を追加してください。 19 20//{{AFX_INSERT_LOCATION}} 21// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。 22 23#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) 24

プログラム本体はこちらです。ウィンドウプロシージャWindowProcでウィンドウメッセージWM_LBUTTONDOWN, WM_RBUTTONDOWNをハンドリングさせます。

// VC6Win32.cpp : アプリケーション用のエントリ ポイントの定義 // #include "stdafx.h" LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); const TCHAR szAppName[] = TEXT("Sample"); int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof(wc); wc.style = 0; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hinst; wc.hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; wc.hIconSm = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); if (RegisterClassEx(&wc) == 0) { return 0; } hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL); if (hwnd == NULL) { return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: MessageBox(hwnd, TEXT("LBUTTON clicked!"), szAppName, MB_OK); break; case WM_RBUTTONDOWN: MessageBox(hwnd, TEXT("RBUTTON clicked!"), szAppName, MB_OK); break; default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }

投稿2018/05/22 03:12

編集2018/05/22 03:20
dodox86

総合スコア9183

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

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

0

そのコードをどこから持ってきたのか、なにをさせようとしてるのかいまいち謎ですが、
それはともかく、h_RunがTrueの場合にこのコードに入ったら、無限ループとなってしまいますがそれはいいのでしょうか

投稿2018/05/22 00:57

y_waiwai

総合スコア87747

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

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

y_waiwai

2018/05/22 01:17

まあ、それはいいということにしといて、 WM_なんちゃらをwParamとlParamで比較してますが、ここは message で比較するんじゃないでしょうか
eisaku123

2018/05/22 01:21

if(message == WM_LBUTTONUP) だとエラーがでます。 「error C2678: 二項演算子 '==' : 型 'struct tagMSG' の左オペランドを扱う演算子は定義されていません。」 とでます
y_waiwai

2018/05/22 01:23

message.message と比較します
eisaku123

2018/05/22 01:25

それはもうやってます。 ソース参照を願います。
y_waiwai

2018/05/22 01:29

wParamやlparamと比較してるのはなんか目的があるんでしょうか? まあ、ほかにもたくさんツッコミどころはありそうなので、これだけでどうにかなるもんとも思えませんが。
y_waiwai

2018/05/22 01:30

VisualStudioを使ってるのなら、ブレークポイントやステップ実行などのデバッグ機能があるので、そういうのを使ってデバッグしたらどうでしょうか
eisaku123

2018/05/22 01:51

ありがとうございます。ちょっと急ぎなので、 何かしら雛形てきなヒントをだしていただけると助かるのですが。。。。汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問