ダイアログを表示するDLLでキー入力 – プログラミング – Home

ダイアログを表示するDLLでキー入力
 
通知
すべてクリア

[解決済] ダイアログを表示するDLLでキー入力

固定ページ 1 / 2

ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

SDKでDialogBoxマクロを使用してダイアログを表示するDLLを作成しています。

ダイアログなのでDlgProcでWM_CHAR、WM_KEYDOWNなどのキー入力の
メッセージがつかまりません。

MFCの場合はPreTranslateMessageで処理をするみたいですが、
SDKの場合はどうやるのでしょうか?

いろいろ探しても見つかりませんでした。
よろしくお願いします。

VC++6.0 SP5/win2000 SP3 MFC未使用


引用未解決
トピックタグ
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 22年前
投稿: 196
 

>MFCの場合はPreTranslateMessageで処理をするみたいですが、
>SDKの場合はどうやるのでしょうか?

GetMessage() の直後で処理すればいいんじゃないでしょうか。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

DllなのでWinMain?がない為GetMessage() はありません。
DllMain内にGetMessage() を持つことは可能なのですか?
サンプルソース載せてもらえないでしょうか?

まだDllやSDKをよく理解できてない状態なので言っている事がおかしいかもしれません。

よろしくお願いします。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 22年前
投稿: 196
 

>DllなのでWinMain?がない為GetMessage() はありません。

ごめんなさい、DLL ってとこを見落としてました。

>DllMain内にGetMessage() を持つことは可能なのですか?

可能は可能ですが、DLL 内に置いたメッセージポンプをアプリ側から呼んでもらうのは
ツライですね。

↑よりは、DLL に PreTranslateMessage() に相当する関数を用意して、アプリ本体のメ
ッセージポンプの GetMessage() 直後にそれを呼び出してもらう方がマシかもしれませ
ん。

ダイアログプロシージャで WM_GETDLGCODE の戻り値に DLGC_WANTCHARS などを含む値を
返せば、WM_CHAR などがダイアログプロシージャに渡されるようになるようですが、こ
の場合他に調整箇所が出るかもしれません。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。

WM_GETDLGCODE を調べてみます。
結果が出たら報告します。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ダイアログプロシージャに WM_GETDLGCODE を追加しても
飛んできませんでした。
WM_INITDIALOGと同じように記述しています。

WM_GETDLGCODEはコントロール向けに発行されるメッセージみたいですが
ダイアログで受取ることはできるのでしょうか?

それとPreTranslateMessage相当をSDKで実現する方法はありますか?
それはDLLでも通用しますか?

質問ばかりですみませんが、よろしくお願いします。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 この件ってDLLって、そう関係ないのでは???
 DialogBoxを使うのをやめて「CreateDialog+自分でメッセージループ」に
すればいいのでは?(?_?)


返信引用
ku
 ku
(@ku)
ゲスト
結合: 25年前
投稿: 312
 

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


返信引用
SR20DE
 SR20DE
(@SR20DE)
ゲスト
結合: 22年前
投稿: 4
 

>モーダルでやるならWM_INITDIALOGでSetWindowLongでダイアログプロシージャを
>フックすればWM_KEYDOWNを拾えるって書いてあったんですが
>ちょっと試したらうまくいかなかったんですよ(どこかミスってるんだと思うんですが)

キー入力ってフォーカスがあるウィンドウ(コントロール)に行くから
親(ダイアログ)で受け取れなかったような気がします。

スレッド立てれば自前のメッセージループを持てますね。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

何度もすみません
CreateDialog+自分でメッセージループで
DLL内でメッセージループを持つ方法がわかりません。

DLLMainは一回しかこないのでここではループにならないので
どうやってやるのでしょうか?

WinMainを作成するのかな?
何かサンプルになるものはないでしょうか?

WM_INITDIALOGでSetWindowLongの方法はまだ調べていません。
できればCreateDialog+自分でメッセージループでいきたいので。

よろしくお願いします


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 DialogBoxを使用してるということは、WinMainではなく関数を呼び出してると思います
が、、、
 そこで、行います。
 DialogBoxを「CreateDialog+自分でメッセージループ」に置き換えるということです。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 22年前
投稿: 196
 

でもこれ、モーダルダイアログなんですよね?

>DialogBoxを「CreateDialog+自分でメッセージループ」に置き換えるということで
す。

↑のように置き換えるためには、親ウィンドウの disable やなんかもやらなくちゃいけ
ないような気が。。。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 DLGCORE.CPPのCDialog::DoModalを参考にするといいでしょう。
 基本的には親をIsWindowEnabledでチェックしてEnableWindowを処理すると。


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

何度も何度もすみません

>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これから見ます
結果がでたら報告します


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

再度お願いします。
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は難しいです。
よろしくお願いします。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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