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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

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

Q&A

解決済

2回答

4031閲覧

VC++ WM_INITDIALOG フックされない

Akitako

総合スコア9

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

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

0グッド

0クリップ

投稿2015/06/04 16:08

編集2015/06/05 12:04

###前提・実現したいこと
言語:Visual C++
実行環境:WinCE3.0 → WinCE6.0/開発環境:eVC3.0 → VS2008
.NETフレームワークは未使用(のはず・・・)

###発生している問題・エラーメッセージ
C、Windowsプログラミングがよくわかっていないので漠然とした質問ですみません。
ウインドウプロシージャで、WM_INITDIALOGは必ず最初に動作する(追記:WMの種類にもよるか・・・)と思い込んでるんですが、最初にフックされない理由は何が考えられるでしょうか?
eVC3.0では最初に動作していていたはず・・・

こんな質問でわかる方いたらお願いします。

2015/06/05 ソースを追記します。
IプロシージャとRプロシージャの違いはないのに、IプロシージャだけWM_INITDIALOGが呼ばれません。
※main.cppのDialogBoxのコメントを付け替えて比較しました。

###ソース
*********************** main.cpp *********************************
*********************** 一部省略
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){
switch( message ){
case WM_CREATE:
// ウインドウ作成完まではメインダイアログを表示しないため、一旦ユーザメッセージを送信
PostMessage( hWnd, WM_APP, 0, 0 );
break;
case WM_APP:
DialogBox( g_hInstance, MAKEINTRESOURCE( IDD_I ), hWnd, ( DLGPROC )I_WndProc );
// DialogBox( g_hInstance, MAKEINTRESOURCE( IDD_R ), hWnd, ( DLGPROC )R_WndProc );
DestroyWindow( hWnd );
break;
case WM_DESTROY:
// アプリ終了
PostQuitMessage( 0 );
break;
default:
// 他はデフォルト処理
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}

*********************** R.cpp *********************************
#include "stdafx.h"
#include "common.h"

// 関数の前宣言
LRESULT CALLBACK R_WndProc( HWND, UINT, WPARAM, LPARAM );

LRESULT CALLBACK R_WndProc( HWND m_hWnd, UINT m_iMsg, WPARAM m_wParam, LPARAM m_lParam ){
switch( m_iMsg ){
case WM_INITDIALOG:
MessageBox(m_hWnd, _T("INITDIALOG"), _T( "R" ), MB_OK );
PostMessage( m_hWnd, WM_APP, 0, 0 );
return false;

case WM_APP: MessageBox(m_hWnd, _T("WM_APP"), _T( "R" ), MB_OK ); EndDialog( m_hWnd, true ); return false; default: return false; } return true;

}

*********************** I.cpp *********************************
#include "stdafx.h"
#include "common.h"

// 関数の前宣言
LRESULT CALLBACK I_WndProc( HWND, UINT, WPARAM, LPARAM );

LRESULT CALLBACK I_WndProc( HWND m_hWnd, UINT m_iMsg, WPARAM m_wParam, LPARAM m_lParam ){
switch( m_iMsg ){
case WM_INITDIALOG:
MessageBox(m_hWnd, _T("INITDIALOG"), _T( "I" ), MB_OK );
PostMessage( m_hWnd, WM_APP, 0, 0 );
return false;

case WM_APP: MessageBox(m_hWnd, _T("WM_APP"), _T( "I" ), MB_OK ); EndDialog( m_hWnd, true ); return false; default: return false; } return true;

}

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

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

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

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

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

guest

回答2

0

原因はリソースにあったようです。
WS_EX_CLIENTEDGE というコントロールがあるのですが、これをなくした所呼び出されるようになりました。
使いたいので、これはこれで困りますが、解決としたいと思います。

YukiMiyatake様、ありがとうございました。

エミュレータでデバッグができ、送られてくるウインドウメッセージは48番と71番が流れているようです。

投稿2015/06/05 12:08

Akitako

総合スコア9

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

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

0

ベストアンサー

WindowsCEから Windows(xp? 7? 8?) への移植でしょうか?
アンマネージド(.netフレームワークを使わない)ですよね?

CEとWindowsでは色々と違いがありますので、完全にそのまま動かない部分もあります
WM_INITDIALOG ということは ダイアログでしょうか?
ウインドウの場合は WM_CREATE等が呼ばれます

メッセージループ(PeekMessage、GetMessage、WaitMassage 関数)の中でログを吐き
どんなメッセージが来ているか調べる
あるいは spyというツールを使えば ウインドウメッセージをキャプチャできたはずなので

それで 動作が正しいか確認してみて下さい

投稿2015/06/04 19:26

YukiMiyatake

総合スコア144

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

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

Akitako

2015/06/04 23:51

回答ありがとうございます。 実機でしか動かせない状況ですが、メッセージが何かですね。確認してみます。 前提条件が不足していました。 実行環境:WinCE3.0 → WinCE6.0/開発環境:eVC3.0 → VS2008 .NETフレームワークは未使用(のはずです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問