掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
SendMessageの設定の仕方 (ID:66062)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
整理します。 VBのForm→親ウィンドウ・・・(1) VBのFormの中のTextBox→Formの子ウィンドウ・・・(2) という関係であるため、(2)のウィンドウハンドルを取得するためには どうしても(2)のウィンドウハンドルを取得する必要があります。 (1)のウィンドウハンドルはFindWindow(またはFindWindowEx)等で取得します。 このとき必要な情報は「ウィンドウタイトル名」および「クラス名」 です。 ウィンドウのタイトルバーに出る文字が一意であれば、ふつうはこれを指定して取得します。 HWND hWnd; hWnd = ::FindWindow(NULL, _T("VBのウィンドウタイトル名")); で、次に子ウィンドウの取得方法ですが、 ・EnumChildWindows ・FindWindowEx ・GetDlgItem 等方法があります。 EnumChildWindowsはCALLBACK関数が必要になるので初心者向けではないので 省略します。 下の2は親ウィンドウのウィンドウハンドルから取得します。 FindWindowExの場合、TextBoxの場合クラス名で取得することになります。 ここで同じクラス名のコントロールがいくつもあるとき、FindWindowExは 工夫しなければ使いづらいです。 そこでコントロールIDと呼ばれる一意で普遍な値があるので、 それを使って取得するというのがGetDlgItemです。 # ということで # >それにコントロールIDってspy++で見たところ毎回変わっているようなんですが。 # は本当なのかなぁと。 よって、コードで書くと HWND hEdit = ::GetDlgItem(hWnd, 0xXXXXXXX); と取得できます。 で結局のところSendMessageをhEditに対して使うので通しで書くと HWND hWnd; hWnd = ::FindWindow(NULL, _T("VBのウィンドウタイトル名")); HWND hEdit = ::GetDlgItem(hWnd, 0xXXXXXXX); ::SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)"処理終了です!"); となるわけです。 ここで、私がSendDlgItemMessageを押したのはしたの2行を1行でかけるという点です。 HWND hWnd; hWnd = ::FindWindow(NULL, _T("VBのウィンドウタイトル名")); ::SendDlgItemMessage(hEdit, 0xXXXXXXXX, WM_SETTEXT, 0, (LPARAM)"処理終了です!"); まぁ、これがいやならSendDlgItemMessageを使わないでいいです。 で、 >WindowsForms10.EDIT.app.0.14fd2b5という不可解なクラス名を指定しても >ハンドルが取得できないのが問題だと思うんですが? はどこで指定しているのかによります。 (1)を取得して、(2)を取得するときにFindWindowExの第3引数に指定しているのか? ってことです。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.