Excel2010 VBAでの質問です。
画面上のすべてのトップレベルウィンドウを取り出そうと、標準モジュールに以下コーディングしました。
Option Explicit
Declare Function EnumWindows Lib "User32.dll" (ByVal Proc As EnumWinProc, ByVal lParam As Integer) As Boolean
Delegate EnumWinProc (ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
Sub Main()
Call EnumWindows(AddressOf disp_hwnd, 0)
MsgBox ("完了")
End Sub
Function disp_hwnd(ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
MsgBox (hwnd)
disp_hwnd = True
End Function
そうしたところ、Delegate 文が赤文字に反転してエラーになります。
Excel2003 VBAでは使えない構文なのでしょうか?あるいは何かのミスなのでしょうか?
環境ですが、WindowsXP SP3、Excel2003 SP3です。
.NET Framework1.1、2.0、3.0、4.0がインストールされています。
あと、以下の参照設定はあります。
Visual Basic For Applications
Microsoft Excel 11.0 Object Library
OLE Automation
Microsoft Office 11.0 Object Library
Microsoft Forms 2.0 Object Library
Microsoft Scripting Runtime
Microsoft Windows Common Controls 6.0 (SP6)
以上、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
以前に、Yukiさんから教えていただいたモノです。
解説出来るだけのスキルはいまだに持ち合わせておりませぬ orz
Excel2010 & 32bit バージョンでの確認ですが、多分2003でも機能するハズです。
※サイトの都合上、タブインデントの代わりに全角スペースにしています。
' すべてのウィンドウ
Declare Function EnumWindows Lib "user32.dll" _
(ByVal lpEnumFunc As Long, lParam As Any) As Long
Public Declare Function IsWindowVisible Lib "User32" _
(ByVal Hwnd As Long) As Long
' ウィンドウのクラス名
Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" _
(ByVal Hwnd As Long, ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long
' ウィンドウテキスト
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" _
(ByVal Hwnd As Long, ByVal lpString As String, _
ByVal nMaxCount As Long) As Long
'親ウインドウの
Public Declare Function GetParent Lib "User32" _
(ByVal Hwnd As Long) As Long
'ウインドウ文字列の長さ
Public Declare Function GetWindowTextLength Lib "User32" Alias "GetWindowTextLengthA" _
(ByVal Hwnd As Long) As Long
'ウインドウ設定値
Public Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" _
(ByVal Hwnd As Long, ByVal nIndex As Long) As Long
Public Const GWL_STYLE = (-16)
Public Const WS_SYSMENU = &H80000
Public Const WS_BORDER = &H800000
' コールバック関数
Function EnumWindowsProc(ByVal Hwnd As Long, lParam As Worksheet) As Long
Dim wks As Worksheet
Dim strWindowClassNameBuff As String * 128
Dim strWindowTextBuff As String * 516
Dim lngRtnCode As Long
Dim lngStyle As Long
Dim lngRow As Long
'表示状態
If IsWindowVisible(Hwnd) = 0 Then GoTo EnumPass
'親ウインドウ
If GetParent(Hwnd) <> 0 Then GoTo EnumPass
'タイトルバー文字長さ
If GetWindowTextLength(Hwnd) = 0 Then GoTo EnumPass
lngStyle = GetWindowLong(Hwnd, GWL_STYLE)
'システムメニュー
If Not lngStyle And WS_SYSMENU Then GoTo EnumPass
'境界線
If Not lngStyle And WS_BORDER Then GoTo EnumPass
Set wks = lParam
lngRow = wks.Range("A65536").End(xlUp).Row + 1
' ウィンドウハンドル
wks.Cells(lngRow, 1).NumberFormatLocal = "@"
wks.Cells(lngRow, 1).Value = CStr(Right("00000000" & Hex(Hwnd), 8))
' クラス名をバッファに
lngRtnCode = GetClassName(Hwnd, strWindowClassNameBuff, _
Len(strWindowClassNameBuff))
' クラス名表示
wks.Cells(lngRow, 2).Value = Left(strWindowClassNameBuff, _
InStr(strWindowClassNameBuff, vbNullChar) - 1)
' タイトルバーテキストをバッファに
lngRtnCode = GetWindowText(Hwnd, strWindowTextBuff, Len(strWindowTextBuff))
' タイトルバーテキスト表示
wks.Cells(lngRow, 3).Value = Left(strWindowTextBuff, InStr(strWindowTextBuff, _
vbNullChar) - 1)
' 列挙を継続
EnumPass:
EnumWindowsProc = True
End Function
Sub TEST()
Dim lngRtnCode As Long
' シートクリア
Worksheets(1).Cells.Clear
Worksheets(1).Range("A1").Resize(, 3).Value _
= Array("WindowHandle", "ClassName", "WindowText")
' トップレベルウィンドウを列挙
lngRtnCode = EnumWindows(AddressOf EnumWindowsProc, Worksheets(1))
Worksheets(1).Columns("A:C").AutoFit
End Sub
ありがとうございました。
できました。
ですが、また問題が出ました。
リモートデスクトップの中のウィンドウハンドルは取得できないのでしょうか。
別に質問を立てたいと思います。
今回はありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
ExcelVBA Delegate文がエラー...
-
ダイアログをスクロールさせるには
-
エクセルで複数のウィンドウ枠...
-
検索の画面がでなくなってしま...
-
c++/cli .NET Formアプリケー...
-
ゲームでは結局どっちが良いの?
-
UWSCでランダムな処理をする場合
-
勝手にウィンドウが開いて止ま...
-
Windows10 名前をつけて保存で...
-
focusメソッドを使ってもカーソ...
-
ExcelVBA:フォームの最小化ボ...
-
Msgboxの変数の表示につ...
-
EXCEL VBA WindowsAPIの文字列...
-
eclipseからコンソールが消えた
-
グラフを別ウィンドウで立ち上...
-
Excelの上下を固定したい
-
最大化と最小化ボタン
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
VBA .Value=.Value ?
-
ラジオボタンの初期指定
-
作成したウインドウのサイズを...
-
Vba LongPtrについて教えてくだ...
-
Excelの上下を固定したい
-
他のアプリケーションの終了処理
-
【VB2008】 マウス操作の一時的...
-
「&HFFFF」「&H1A」とは?
-
VBで外部プログラムを位置のみ...
-
ExcelのBOOKが消えた!
-
Alt+P,Alt+NをPostmessageで送...
-
UWSCで特定のChromeのタブをア...
-
Console.WriteLine で表示されない
-
MFC ダイアログ上のID取得につ...
-
最大化と最小化ボタン
おすすめ情報