別のダイアログにSendMessageするには – プログラミング – Home

別のダイアログにSendMessage...
 
通知
すべてクリア

[解決済] 別のダイアログにSendMessageするには


田中
 田中
(@田中)
ゲスト
結合: 24年前
投稿: 9
Topic starter  

あるダイアログから別のダイアログにSendMessageしたいのですがうまくいきません。
私なりにがんがえたプログラムはこうなっていますが、
ハンドルエラーが出てしまいます。

  FindWindow( CHopAssignDlg(呼びたいダイアログのクラス),NULL )->SendMessage(message, wParam, lParam);

どなたか解決法を教えてください。


引用未解決
トピックタグ
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

FindWindow()はHWNDを返しますから、FromHandle()でポインタを取得しSendしましょう。

HWND hWnd = FindWindow( CHopAssignDlg(呼びたいダイアログのクラス),NULL );
if (hWnd)
{
CWnd* pWnd = FromHandle(hWnd); // HWNDからCWnd*を得る
if (pWnd)
pWnd->SendMessage(message, wParam, lParam);
}

こんな感じになると思います。


返信引用
田中
 田中
(@田中)
ゲスト
結合: 24年前
投稿: 9
Topic starter  

早速のお返事ありがとうございます。
Bunさんの使用しているFindWindowはAPIのFindWindowでしょうか?
MFCですとCWnd*を返すので大丈夫だと思ったのですが・・・・

BunさんのプログラムのFindWindowに::をつけてAPIとして呼んでみたところ、
ハンドルが0x0000で帰ってきてしまい、処理を抜けてしまいます。
画面上にCHopAssignDlgのダイアログを表示し、別のダイアログからこのコードを呼ぶだけでは
不十分なんでしょうか?


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

> Bunさんの使用しているFindWindowはAPIのFindWindowでしょうか?
> MFCですとCWnd*を返すので大丈夫だと思ったのですが・・・・

ごめんなさいです。その通りでした。m(__)m

> 画面上にCHopAssignDlgのダイアログを表示し、別のダイアログからこのコードを呼ぶだけでは
> 不十分なんでしょうか?

大丈夫ではないでしょうかね?
クラス名が違っているということはないでしょうか?
spy++で確認されてみては?

最初の通りのコードで良いと思います。この場合のハンドルエラーとはどんなエラー
でしょうか?


返信引用
田中
 田中
(@田中)
ゲスト
結合: 24年前
投稿: 9
Topic starter  

Bunさん、またしてもお返事ありがとうございます。
私なりに調べてみたところ、FindWindowは子運動に対しては検索を行わないようです。
あるメインのウインドウからCHopAssignDlgをよんでいるので、検索に引っかからないんでしょうか?
それともCHopAssignDlg自体がCDialogを継承しているから引っかからないのでしょうか?
ご存知でしたら教えてください。

また子ウインドウでもSendMessageできる方法があれば教えてください。


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

> 私なりに調べてみたところ、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を読んでください。
どーでしょか?(^_^)


返信引用
Bun
 Bun
(@Bun)
ゲスト
結合: 24年前
投稿: 761
 

おまけ

> HWND hWnd = FindWindowEx(NULL, NULL, CHopAssignDlg(呼びたいダイアログのクラス), NULL);

API関数ですから、慣例では
HWND hWnd = ::FindWindowEx(NULL, NULL, CHopAssignDlg(呼びたいダイアログのクラス), NULL);

ですね。


返信引用
田中
 田中
(@田中)
ゲスト
結合: 24年前
投稿: 9
Topic starter  

Bunさんたびたびありがとうございます。
やはりクラス名が違っていると思い、
GetClassNameでクラス名を取ってきたところ#32770(ダイアログ)
が帰ってきましたので
FindWindowEx(NULL, NULL, #32770, ウインドウ名);
でやってみたところ取得することができました。
最初の思惑とは少し違いますが、動いたのでこれでよしとしようと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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