あるダイアログから別のダイアログにSendMessageしたいのですがうまくいきません。
私なりにがんがえたプログラムはこうなっていますが、
ハンドルエラーが出てしまいます。
FindWindow( CHopAssignDlg(呼びたいダイアログのクラス),NULL )->SendMessage(message, wParam, lParam);
どなたか解決法を教えてください。
FindWindow()はHWNDを返しますから、FromHandle()でポインタを取得しSendしましょう。
HWND hWnd = FindWindow( CHopAssignDlg(呼びたいダイアログのクラス),NULL );
if (hWnd)
{
CWnd* pWnd = FromHandle(hWnd); // HWNDからCWnd*を得る
if (pWnd)
pWnd->SendMessage(message, wParam, lParam);
}
こんな感じになると思います。
早速のお返事ありがとうございます。
Bunさんの使用しているFindWindowはAPIのFindWindowでしょうか?
MFCですとCWnd*を返すので大丈夫だと思ったのですが・・・・
BunさんのプログラムのFindWindowに::をつけてAPIとして呼んでみたところ、
ハンドルが0x0000で帰ってきてしまい、処理を抜けてしまいます。
画面上にCHopAssignDlgのダイアログを表示し、別のダイアログからこのコードを呼ぶだけでは
不十分なんでしょうか?
> Bunさんの使用しているFindWindowはAPIのFindWindowでしょうか?
> MFCですとCWnd*を返すので大丈夫だと思ったのですが・・・・
ごめんなさいです。その通りでした。m(__)m
> 画面上にCHopAssignDlgのダイアログを表示し、別のダイアログからこのコードを呼ぶだけでは
> 不十分なんでしょうか?
大丈夫ではないでしょうかね?
クラス名が違っているということはないでしょうか?
spy++で確認されてみては?
最初の通りのコードで良いと思います。この場合のハンドルエラーとはどんなエラー
でしょうか?
Bunさん、またしてもお返事ありがとうございます。
私なりに調べてみたところ、FindWindowは子運動に対しては検索を行わないようです。
あるメインのウインドウからCHopAssignDlgをよんでいるので、検索に引っかからないんでしょうか?
それともCHopAssignDlg自体がCDialogを継承しているから引っかからないのでしょうか?
ご存知でしたら教えてください。
また子ウインドウでもSendMessageできる方法があれば教えてください。
> 私なりに調べてみたところ、FindWindowは子運動に対しては検索を行わないようです。
またまた失礼しました。FindWindowはトップレベルしか検索しませんです。はい。
API関数のFindWindowEx()を使いましょう。
こんどは、こうなりますかね。
HWND hWnd = FindWindowEx(NULL, NULL, CHopAssignDlg(呼びたいダイアログのクラス), NULL);
if (hWnd)
{
CWnd* pWnd = FromHandle(hWnd); // HWNDからCWnd*を得る
if (pWnd)
pWnd->SendMessage(message, wParam, lParam);
}
必要に応じてFindWindowExのHELPを読んでください。
どーでしょか?(^_^)
おまけ
> HWND hWnd = FindWindowEx(NULL, NULL, CHopAssignDlg(呼びたいダイアログのクラス), NULL);
API関数ですから、慣例では
HWND hWnd = ::FindWindowEx(NULL, NULL, CHopAssignDlg(呼びたいダイアログのクラス), NULL);
ですね。
Bunさんたびたびありがとうございます。
やはりクラス名が違っていると思い、
GetClassNameでクラス名を取ってきたところ#32770(ダイアログ)
が帰ってきましたので
FindWindowEx(NULL, NULL, #32770, ウインドウ名);
でやってみたところ取得することができました。
最初の思惑とは少し違いますが、動いたのでこれでよしとしようと思います。