WM_TIMERとDialogBox関数について

[戻る]
絶草 [E-Mail] 2015/08/24(月) 13:50:03
WM_TIMERが来ません。
DialogBoxでダイアログボックスも出来ません
コードは1000行を超えているのでここの部分が必要というところは言われたら貼ります。

参考になればよろしいですが
・SetWindowPosでHWND_TOPMOSTを指定している
・SetWindowLongでWS_EX_LAYEREDとWS_EX_TOOLWINDOWを指定している
・ダイアログプロージャーはdllに入っている

このような感じです。
DialogBox(hgInst,TEXT("MYDLG"),hWnd,(DLGPROC)DlgProc);

仲澤@失業者 2015/08/24(月) 17:19:11
1.特定のHWNDをもつウインドウにWM_TIMERメッセージが来るはずである。

というからには、以下の様なコードが実行されている必要があります。

 SetTimer(
    hwnd,  //「WM_TIMERを受け取るHWND」
    timerID, // 対象タイマーの識別子。てきとーな値でよし
    elapse,  // タイムアウト値。単位が[ms]なので、1秒の場合は1000ですね
    NULL);  // タイマープロシージャを使わないのでNULL

該当部分が掲載できますでしょうか。

瀬戸っぷ [E-Mail] 2015/08/24(月) 17:46:48
>・ダイアログプロージャーはdllに入っている
>DialogBox(hgInst,TEXT("MYDLG"),hWnd,(DLGPROC)DlgProc);

プロシージャにブレークポイント置いたらどうなります?
DLLのプロジェクトをアクティブなプロジェクトにして、デバッグの実行ファイルに呼び
出し元の実行ファイルを指定するとVSでデバッグできるハズです。
自前のプロジェクトでない場合には無理ですが…。

プロシージャが動作しなかったパターンとしては…
InitCommonControlsEx()などの初期化をしていなかった為にダイアログの生成に失敗した。
という経験ならありますが。

WM_TIMERについては指摘がありますので、片方だけ。

・ス竭� [E-Mail] 2015/08/24(月) 22:07:12
#define ID_TIMER 300//最初のほう

SetTimer(hWnd,ID_TIMER,300,NULL);//WM_CREATEで

WM_TIMER:
〜処理〜
break;

略すとこんなかんじです

絶草 [E-Mail] 2015/08/24(月) 22:08:47
ダイアログがちゃんと実行できることは簡単なプログラムで確かめています。
でも使いたいプログラムでは出来ません

↑のス竭&#65533は同じです

仲澤@失業者 2015/08/25(火) 10:12:23
では、本題なのですが、

>SetTimer(hWnd,ID_TIMER,300,NULL);//WM_CREATEで

まず、この関数の戻り値が0(=失敗)でないことを確認するべきかもしれません。

次に、上のコードは、
 (1)第一引数である「hWnd」に対して
 (2)300[ms]の間隔で
 (3)WM_TIMERを送れ
としています。
この「hWnd」が、WM_CREATEを受け取ったウインドウである場合、
そのウインドウプロシージャにWM_TIMERが発行されます。
つまり、
 (4)case WM_CREATE:の近辺に
 (5)case WM_TIMER:があるはずですが、そうなってますでしょうか。
もしそうなっている場合、瀬戸っぷさんの提案にあるように、
 (6)そこにブレークポイントをはってから、
デバッグスタートみましょう。
コードがこの説明通りであれば、ブレークポイントの位置で停止するはずです。

aetos 2015/08/25(火) 11:16:43
以下の処理はいずれも DlgProc 内で WM_CREATE の処理として行っているということでし
ょうか?

・SetWindowPosでHWND_TOPMOSTを指定している
・SetWindowLongでWS_EX_LAYEREDとWS_EX_TOOLWINDOWを指定している
・SetTimer

試してみたら DlgProc に WM_CREATE が来ない…。
ダイアログボックスの初期化って WM_INITDIALOG でやるんじゃないんでしたっけ。

aetos 2015/08/25(火) 12:17:32
違うか。諸々の処理は親ウィンドウに対して行っているのか。
失礼しました。

絶草 [E-Mail] 2015/08/25(火) 15:40:43
ブレークポイントを作って確かめてあります。

レイヤーウィンドウの処理等はメインウィンドウのCreateWindowEx直しています。

ダイアログボックスはタスクアイコンの右クリックででたポップアップメニューのダイアログとい
う項目を押すとDialogBoxで作るようにしています。

CreateDialog関数も試しましがだめでした。

絶草 [E-Mail] 2015/08/25(火) 15:42:44
すいません
CreateWindowEx直ではなくCreateWindowExの直後です

みい 2015/08/25(火) 17:47:54
> ダイアログがちゃんと実行できることは簡単なプログラムで確かめています。
> でも使いたいプログラムでは出来ません

・簡単なプログラムを作って、現在のdllを呼び出してダイアログが表示されるのを
 確認した
・ダイアログを表示するだけの簡単なdllを作って、それを呼び出すだけの簡単な
 プログラムを作ってダイアログが表示されるのを確認した
どちらでしょうか。

ゼツ草 [E-Mail] 2015/08/25(火) 21:38:38
ダイアログを表示するだけの簡単なdllを作って、それを呼び出すだけの簡単な
 プログラムを作ってダイアログが表示されるのを確認した

みい 2015/08/26(水) 15:00:02
SetWindowPosやSetWindowLongの指定はその簡単なプログラムの時も同じですか?

ちなみに今のプログラムから簡単なdllを今のdllと同じように呼び出して
表示できますか。

絶草 [E-Mail] 2015/08/26(水) 15:42:13
出来ています

古いスレッドには追加発言できません。