
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
ExcelVBAでAPIを使って外部ウイ...
-
MFC ダイアログ上のID取得につ...
-
Vba LongPtrについて教えてくだ...
-
作成したウインドウのサイズを...
-
皆さん、おはようございます♪ ...
-
勝手にウィンドウが開いて止ま...
-
検索の画面がでなくなってしま...
-
VBAでのタイトルバーの取得
-
【VB2008】 マウス操作の一時的...
-
ウィンドウ名を知るには
-
最大化と最小化ボタン
-
クリスタルレポートからPDFを作...
-
Alt+P,Alt+NをPostmessageで送...
-
ExcelのBOOKが消えた!
-
VB2005のイミディエイト ウィン...
-
C#でファイル転送プログラムWin...
-
ちらつきについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
皆さん、おはようございます♪ ...
-
検索の画面がでなくなってしま...
-
Vba LongPtrについて教えてくだ...
-
【VB2008】 マウス操作の一時的...
-
[VBA] UserForm を Excel の W...
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
UWSCで特定のChromeのタブをア...
-
ExcelのBOOKが消えた!
-
「&HFFFF」「&H1A」とは?
-
ゲームでは結局どっちが良いの?
-
作成したウインドウのサイズを...
-
エクセルで1行目から3行目が消...
-
Console.WriteLine で表示されない
-
Alt+P,Alt+NをPostmessageで送...
-
EnumChildWindowsの使い方(VBA)
おすすめ情報