WM_TIMERとDialogBox関数について – プログラミング – Home

通知
すべてクリア

WM_TIMERとDialogBox関数について


絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 5
Topic starter  

WM_TIMERが来ません。
DialogBoxでダイアログボックスも出来ません
コードは1000行を超えているのでここの部分が必要というところは言われたら貼ります。

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

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


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

1.特定のHWNDをもつウインドウにWM_TIMERメッセージが来るはずである。

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

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>・ダイアログプロージャーはdllに入っている
>DialogBox(hgInst,TEXT(MYDLG),hWnd,(DLGPROC)DlgProc);

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

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

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


返信引用
絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 5
Topic starter  

#define ID_TIMER 300//最初のほう

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

WM_TIMER:
~処理~
break;

略すとこんなかんじです


返信引用
絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 5
Topic starter  

ダイアログがちゃんと実行できることは簡単なプログラムで確かめています。
でも使いたいプログラムでは出来ません

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

では、本題なのですが、

>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
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

以下の処理はいずれも DlgProc 内で WM_CREATE の処理として行っているということでし
ょうか?

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

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

違うか。諸々の処理は親ウィンドウに対して行っているのか。
失礼しました。


返信引用
絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 2
 

ブレークポイントを作って確かめてあります。

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

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

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


返信引用
絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 2
 

すいません
CreateWindowEx直ではなくCreateWindowExの直後です


返信引用
みい
 みい
(@みい)
ゲスト
結合: 22年前
投稿: 65
 

> ダイアログがちゃんと実行できることは簡単なプログラムで確かめています。
> でも使いたいプログラムでは出来ません

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


返信引用
絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 5
Topic starter  

ダイアログを表示するだけの簡単なdllを作って、それを呼び出すだけの簡単な
 プログラムを作ってダイアログが表示されるのを確認した


返信引用
みい
 みい
(@みい)
ゲスト
結合: 22年前
投稿: 65
 

SetWindowPosやSetWindowLongの指定はその簡単なプログラムの時も同じですか?

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


返信引用
絶草
 絶草
(@絶草)
ゲスト
結合: 9年前
投稿: 5
Topic starter  

出来ています


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました