SDKでDialogBoxマクロを使用してダイアログを表示するDLLを作成しています。
ダイアログなのでDlgProcでWM_CHAR、WM_KEYDOWNなどのキー入力の
メッセージがつかまりません。
MFCの場合はPreTranslateMessageで処理をするみたいですが、
SDKの場合はどうやるのでしょうか?
いろいろ探しても見つかりませんでした。
よろしくお願いします。
VC++6.0 SP5/win2000 SP3 MFC未使用
>MFCの場合はPreTranslateMessageで処理をするみたいですが、
>SDKの場合はどうやるのでしょうか?
GetMessage() の直後で処理すればいいんじゃないでしょうか。
DllなのでWinMain?がない為GetMessage() はありません。
DllMain内にGetMessage() を持つことは可能なのですか?
サンプルソース載せてもらえないでしょうか?
まだDllやSDKをよく理解できてない状態なので言っている事がおかしいかもしれません。
よろしくお願いします。
>DllなのでWinMain?がない為GetMessage() はありません。
ごめんなさい、DLL ってとこを見落としてました。
>DllMain内にGetMessage() を持つことは可能なのですか?
可能は可能ですが、DLL 内に置いたメッセージポンプをアプリ側から呼んでもらうのは
ツライですね。
↑よりは、DLL に PreTranslateMessage() に相当する関数を用意して、アプリ本体のメ
ッセージポンプの GetMessage() 直後にそれを呼び出してもらう方がマシかもしれませ
ん。
ダイアログプロシージャで WM_GETDLGCODE の戻り値に DLGC_WANTCHARS などを含む値を
返せば、WM_CHAR などがダイアログプロシージャに渡されるようになるようですが、こ
の場合他に調整箇所が出るかもしれません。
ありがとうございます。
WM_GETDLGCODE を調べてみます。
結果が出たら報告します。
ダイアログプロシージャに WM_GETDLGCODE を追加しても
飛んできませんでした。
WM_INITDIALOGと同じように記述しています。
WM_GETDLGCODEはコントロール向けに発行されるメッセージみたいですが
ダイアログで受取ることはできるのでしょうか?
それとPreTranslateMessage相当をSDKで実現する方法はありますか?
それはDLLでも通用しますか?
質問ばかりですみませんが、よろしくお願いします。
この件ってDLLって、そう関係ないのでは???
DialogBoxを使うのをやめて「CreateDialog+自分でメッセージループ」に
すればいいのでは?(?_?)
DialogBoxマクロって単なるAPIのことだよね?
あれってマクロだったっけ?
SDKでモーダルダイアログを作るとそのままではWM_KEYDOWNは受けられないと思う
MFCの方はDoModal()でも実際にはモードレスダイアログを作成しているので
そのためメッセージポンプがありPreTranslateMessage()を呼んでいるという仕組みです
NEGさんの書いてあるとおり、モードレスでやるならこっちの方式です
モーダルでやるならWM_INITDIALOGでSetWindowLongでダイアログプロシージャを
フックすればWM_KEYDOWNを拾えるって書いてあったんですが
ちょっと試したらうまくいかなかったんですよ(どこかミスってるんだと思うんですが)
URLを下記に書いておきます、がんばってください
http://forums.belution.com/ja/vc/000/056/63.shtml
>モーダルでやるならWM_INITDIALOGでSetWindowLongでダイアログプロシージャを
>フックすればWM_KEYDOWNを拾えるって書いてあったんですが
>ちょっと試したらうまくいかなかったんですよ(どこかミスってるんだと思うんですが)
キー入力ってフォーカスがあるウィンドウ(コントロール)に行くから
親(ダイアログ)で受け取れなかったような気がします。
スレッド立てれば自前のメッセージループを持てますね。
何度もすみません
CreateDialog+自分でメッセージループで
DLL内でメッセージループを持つ方法がわかりません。
DLLMainは一回しかこないのでここではループにならないので
どうやってやるのでしょうか?
WinMainを作成するのかな?
何かサンプルになるものはないでしょうか?
WM_INITDIALOGでSetWindowLongの方法はまだ調べていません。
できればCreateDialog+自分でメッセージループでいきたいので。
よろしくお願いします
DialogBoxを使用してるということは、WinMainではなく関数を呼び出してると思います
が、、、
そこで、行います。
DialogBoxを「CreateDialog+自分でメッセージループ」に置き換えるということです。
でもこれ、モーダルダイアログなんですよね?
>DialogBoxを「CreateDialog+自分でメッセージループ」に置き換えるということで
す。
↑のように置き換えるためには、親ウィンドウの disable やなんかもやらなくちゃいけ
ないような気が。。。
DLGCORE.CPPのCDialog::DoModalを参考にするといいでしょう。
基本的には親をIsWindowEnabledでチェックしてEnableWindowを処理すると。
何度も何度もすみません
>DialogBoxを「CreateDialog+自分でメッセージループ」に置き換えるということです
EXPORT void __stdcall Dialog(LONG hWnd) // この関数で外部から呼び出します
{
HDWND hDlg = CreateDialog(g_hInstance, MYDIALOG, (HWND)hWnd, (DLGPROC)
DlgProc);
while(GetMessage(&msg, NULL, 0, 0)) {
if( msg.message == WM_CHAR ) {
MessageBox(hDlg, WM_CHAR,確認, MB_OK);
}
if (hDlg == 0 || !IsDialogMessage(hDlg, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
で実現できました。ありがとうございます
普通の関数の中にメッセージループをっていうのが思いつきませんでした
ウィンドウプロシージャかダイアログプロシージャだけと思い違いをしておりました。
CDialog::DoModalこれから見ます
結果がでたら報告します
再度お願いします。
F12キーで落ちる現象が発生します
WM_SYSKEYDOWN、WM_CHAR、WM_KEYDOWNでやりましたがどれも
引っかかりませんでした。
// メッセージループ
MSG msg;
while( GetMessage(&msg, NULL, 0, 0) ){
if( msg.message == WM_CHAR ){
MessageBox(hDlg, WM_CHAR,確認, MB_OK);
}
if( msg.message == WM_SYSKEYDOWN ){
MessageBox(hDlg, WM_SYSKEYDOWN,確認, MB_OK);
}
// キー入力取得
if( msg.message == WM_KEYDOWN ){
MessageBox(hDlg, WM_KEYDOWN,確認, MB_OK);
}
以下略
ほかにキーをフック?する方法ってあるのでしょうか?
SDKは難しいです。
よろしくお願いします。