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
教えていただいた参照先のサンプルコードを確認し、
本質問の異常終了の原因がわかりました。
(原因)
4行目のコールバック関数引数の宣言が間違っていました(「ByVal」が抜けていました)。
下記のように修正することでうまく動作することが確認できました。大変お世話になりありがとうございました。
04 Function ListupChildWindows(ByVal hWnd as LongPtr, ByVal lParam as Long) as Boolean
お礼
早速、大変ご丁寧な回答をいただき、 ありがとうございます。 示していただいた参照先についてはまだ確認できていませんが、回答いただいた内容と合わせ、試してみたいと思います。 取り急ぎお礼まで。
補足
教えていただいた参照先のサンプルコードを確認し、 本質問の異常終了の原因がわかりました。 (原因) 4行目のコールバック関数引数の宣言が間違っていました(「ByVal」が抜けていました)。 下記のように修正することでうまく動作することが確認できました。大変お世話になりありがとうございました。 04 Function ListupChildWindows(ByVal hWnd as LongPtr, ByVal lParam as Long) as Boolean