
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)
-
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
-
4
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
5
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
6
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
7
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
8
VB.NETで子ウィンドウの列挙の仕方がわかりません。
Visual Basic(VBA)
-
9
他のアプリケーションとの連携
Visual Basic(VBA)
-
10
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
11
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
12
SendMessageによるチェックボックスの状態取得
Visual Basic(VBA)
-
13
VBAで任意のウインドウのサイズを変更する方法
Visual Basic(VBA)
-
14
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
15
WinAPIで電卓をクリック
Visual Basic(VBA)
-
16
Ctrl + P のメッセージ送信
Visual Basic(VBA)
-
17
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
18
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
19
ExcelVBAでスペースキー操作したい
Excel(エクセル)
-
20
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ExcelのBOOKが消えた!
-
Excelの上下を固定したい
-
Vba LongPtrについて教えてくだ...
-
ラジオボタンの初期指定
-
最大化と最小化ボタン
-
[ExcelVBA] 別ウィンドウのエク...
-
EnumChildWindowsの使い方(VBA)
-
MFC ダイアログ上のID取得につ...
-
VBAで単一ブック複数窓を閉じる...
-
勝手にウィンドウが開いて止ま...
-
MFCアプリケーションでアイコン...
-
[VBA] UserForm を Excel の W...
-
Msgboxの変数の表示につ...
-
DellノートPC購入で悩んでいま...
-
ACCESS2007で起動時にフォーム...
-
常に非アクティブなウィンドウ...
-
最大化でタスクバーを隠す
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
Vba LongPtrについて教えてくだ...
-
勝手にウィンドウが開いて止ま...
-
ラジオボタンの初期指定
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
「&HFFFF」「&H1A」とは?
-
ExcelのBOOKが消えた!
-
エクセルで1行目から3行目が消...
-
[VBA] UserForm を Excel の W...
-
【VB2008】 マウス操作の一時的...
-
VBA .Value=.Value ?
-
作成したウインドウのサイズを...
-
DellノートPC購入で悩んでいま...
-
UWSCで特定のChromeのタブをア...
-
Alt+P,Alt+NをPostmessageで送...
-
隠れたウィンドウの画面をキャ...
-
Console.WriteLine で表示されない
おすすめ情報