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も見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
牛、豚、鶏、どれか一つ食べられなくなるとしたら?
牛肉、豚肉、鶏肉のうち、どれか一種類をこの先一生食べられなくなるとしたらどれを我慢しますか?
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
-
4
WinAPIで電卓をクリック
Visual Basic(VBA)
-
5
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
6
VBA SendMessage 無限ループにどうして無限ループになるんですか
Visual Basic(VBA)
-
7
VB.NETで子ウィンドウの列挙の仕方がわかりません。
Visual Basic(VBA)
-
8
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
9
Excel VBAで他アプリケーションの文字列取得
Excel(エクセル)
-
10
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
11
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
12
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
13
ウィンドウを最前面にできません
Visual Basic(VBA)
-
14
他アプリケーション’(ウィンドウ)のハンドル取得方法
Visual Basic(VBA)
-
15
他のアプリケーションとの連携
Visual Basic(VBA)
-
16
VB.netでFindWindowExやると・・・9222812402616107008!?
Visual Basic(VBA)
-
17
VBAで任意のウインドウのサイズを変更する方法
Visual Basic(VBA)
-
18
今更、VBAでRPA、キーボード操作自動化ってどうやるの?
Visual Basic(VBA)
-
19
起動中のアプリ、ソフトの取得
Visual Basic(VBA)
-
20
別のアプリケーションのテキストフィールドに入力する方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ラジオボタンの初期指定
-
VBA .Value=.Value ?
-
MFC ダイアログ→MDI風に変更
-
勝手にウィンドウが開いて止ま...
-
エクセルで保存したものを開く...
-
ExcelのBOOKが消えた!
-
ゲームでは結局どっちが良いの?
-
グラフを別ウィンドウで立ち上...
-
[VBA] UserForm を Excel の W...
-
Console.WriteLine で表示されない
-
Vba LongPtrについて教えてくだ...
-
隠れたウィンドウの画面をキャ...
-
focusメソッドを使ってもカーソ...
-
MFC ダイアログ上のID取得につ...
-
ブック構成の保護
-
UWSCで特定のChromeのタブをア...
-
EnumChildWindowsの使い方(VBA)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
ExcelのBOOKが消えた!
-
VBA .Value=.Value ?
-
[VBA] UserForm を Excel の W...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
Excelの上下を固定したい
-
【VB2008】 マウス操作の一時的...
-
「&HFFFF」「&H1A」とは?
-
作成したウインドウのサイズを...
-
親ウインドウにあるOKボタンを...
-
他のアプリケーションの終了処理
-
MFC ダイアログ上のID取得につ...
-
ExcelVBAでAPIを使って外部ウイ...
-
EnumChildWindowsの使い方(VBA)
-
Alt+P,Alt+NをPostmessageで送...
-
Vba LongPtrについて教えてくだ...
おすすめ情報