
64bit版ExcelのVBAでEnumChildWindowsを使用して、子ウィンドウのウィンドウハンドルを
取得したいと考えています。
下記のようなサンプルを作ってみましたが、コールバック関数でExcelが異常終了します。
(05行目にブレークポイントを設定、各変数の値を参照しようとした時点でExcelが異常終了)
また、コールバック関数の第3引数(lParam)の型をInteger,Long,LongPtr等変えてみましたが、
いずれもExcelの異常終了となりました。
つきまして、64bit Excelでの本APIの使い方を教えていただきたくよろしくお願いいたします。
(なお、32bit版のExcelでは正常に動作しました)
<以下サンプルコード>
行 コード
01 Declare PtrSafe Function EnumChildWindows Lib "user32.dll" (ByVal ParenthWnd as LongPtr, ByVal EnumWindosPROC as LongPtr,ByVal lParam as Long) as Integer
02
03
04 Function ListupChildWindows(hWnd as LongPtr,lParam as Long) as Boolean
05 MsgBox hWnd
06 ListupChildWIndows =True
07 End Function
08
09 Sub test_CwinList
10 Dim ThishWnd as LongPtr
11
12 ThishWnd=Excel.Application.hWnd
13 Call EnumChildWindows (ThishWnd , AddressOf ListupChildWindows ,0)
14 End Sub
No.1ベストアンサー
- 回答日時:
こんにちは。
ご提示のサンプルですが、当方のVBA7x64環境でも
(実行の度に無条件で必ず)Excelの異常終了を再現できました。
この問題の解決については、私の力量を越えていますので、
情報提供、という形でお応えします。
『APPS PRO > VBA Tips > How Can I Locate a Specific Child Window Handle?』
http://www.appspro.com/Tips/VBA%20Tips.htm
こちらのページの一番下の[EnumChildWindows]をクリックすると
x32|x64両方対応のサンプルコードが入手できます。
そのままこちらで試してみた処、
(このサンプルは、ThisWorkbook.Windows(1)のハンドル'だけ'を取得するものなので)
エラーにはなりませんでした。
コールバック関数側で、条件分岐を書き換えてみたり、
無条件でWindowClassやWindowTitleを取得するよう試みたりして、
約30(重複を含む)の子ウィンドウのウィンドウハンドルが取得出来る所までは確認しましたが、
すべてを取得出来ていないか、うまく終了させることが出来ていないか、どちらかで、
完全な動作を確認するには至りませんでした。
デバッグのヒントにはなりそうな気はしますので、サンプル試してみては如何でしょう。
もしうまく行く方法があるとすれば、
WindowClassとWindowTitleでの条件分岐を整理して、
適切に列挙を終了させることになるような気がしています。
例えばThisWorkbook.Windows(1)のWindowClassとWindowTitleが確認できたら、
(そこから数えてx番目の子ウィンドウで、、、x = 0 かも?)
コールバック関数の戻りを0にして列挙を終了する、、、、みたいな?
或いは、特定の子ウィンドウに限定できるなら、同様にうまく扱えるようにも思えます。
実践的には、同じハンドルが重複して戻る場合があることを考慮して、
ハンドル列挙の受け皿としてCollectionオブジェクト等を用いることになるかと思いますが、
もしかしたら、この戻り値の重複についてもチェックしてみた方がいいのかも??知れません。
参考になるか解りませんが、以上です。
この回答への補足
教えていただいた参照先のサンプルコードを確認し、
本質問の異常終了の原因がわかりました。
(原因)
4行目のコールバック関数引数の宣言が間違っていました(「ByVal」が抜けていました)。
下記のように修正することでうまく動作することが確認できました。大変お世話になりありがとうございました。
04 Function ListupChildWindows(ByVal hWnd as LongPtr, ByVal lParam as Long) as Boolean
早速、大変ご丁寧な回答をいただき、
ありがとうございます。
示していただいた参照先についてはまだ確認できていませんが、回答いただいた内容と合わせ、試してみたいと思います。
取り急ぎお礼まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
このQ&Aを見た人はこんなQ&Aも見ています
-
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
-
4
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
5
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
8
SendMessageによるチェックボックスの状態取得
Visual Basic(VBA)
-
9
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
10
Vba UserFormを前面に出す方法を教えてください
Visual Basic(VBA)
-
11
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
12
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
13
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
14
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
15
ExcelVBAでスペースキー操作したい
Excel(エクセル)
-
16
VB.NETで子ウィンドウの列挙の仕方がわかりません。
Visual Basic(VBA)
-
17
Excel VBAでマウスの左クリックのイベントを検知するには
Visual Basic(VBA)
-
18
エクセルVBAのフォームを最前面にする方法を教えてください。
Visual Basic(VBA)
-
19
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
20
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
勝手にウィンドウが開いて止ま...
-
「アイテムは収集されました」...
-
TreeView表示がおかしいです。
-
ウィンドウの破棄について
-
UWSCで特定のChromeのタブをア...
-
「&HFFFF」「&H1A」とは?
-
ExcelVBA:フォームの最小化ボ...
-
ゲームでは結局どっちが良いの?
-
Windows10 名前をつけて保存で...
-
Excelのウィンドウを縦に並べて...
-
WM_PAINT 処理が完了したタイミ...
-
XPではタイトルバーが無いウィ...
-
添付した画像のようなウィンド...
-
EnumChildWindowsの使い方(VBA)
-
C#でファイル転送プログラムWin...
-
別ウインドウのハンドル取得の方法
-
ウィンドウ作成時のメモリ使用...
-
VBでアプリケーションを自動操...
-
VB5で他のアプリケーションへの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
Vba LongPtrについて教えてくだ...
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
[VBA] UserForm を Excel の W...
-
VBA .Value=.Value ?
-
作成したウインドウのサイズを...
-
Console.WriteLine で表示されない
-
エクセルで1行目から3行目が消...
-
「&HFFFF」「&H1A」とは?
-
【VB2008】 マウス操作の一時的...
-
UWSCで特定のChromeのタブをア...
-
他のアプリケーションの終了処理
-
MFCでハンドルを取得するには
-
VBAで単一ブック複数窓を閉じる...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報