Note

Club KAMIYUI Love 怖人 髪結い日記

全体表示

[ リスト ]

列挙(EnumWindows by VBA)

 「あなたはダ〜アレ」って聞かれたら「メルモ」ちゃんとは答えない。

時には「男辛之でごじゃる。」答えるが、ホトンド「ハマさんです。」と答える。

仮の源氏名は「hatakanajp」だ。

それでは、パソコンのモニターに映っているソフト達にも聞いてみよう。

ソフト達に名前を聞く呪文は。。。

「テクマクマヤコン,テクマクマヤコン、あなたはダ〜アレ?」

あれ!答えてくれない。呪文を間違えてのだろうか。おかしい。

TVだったら、答えていたのに。。。不思議だ。

シカタがない。EnumWindows関数で聞いてみよう。

クラスの列挙


イメージ 1


 DelphiやVisual Studioで、表示されているアプリケーションの

クラスの名前を調べる場合、EnumWindows関数を使うのが一般的なようだ。

私が持っているWin32APIに関するVBAの本を見ると、FindWindow,IsWindowVisible

GetWindowText、GetClassNameのWin32API関数と、Do〜Loopステートメント

を組み合わせて求めてあった。私の持っている本が古いためだろうか

VBAでEnumWindows関数とコールバック関数を使う方法をネットで調べてみたが、

よい見本が見当たらない。MSDNを見ても。。。

肝心な部分は Office 2000 Developer CD-ROM の中に入っていると書いてある。

Developerなんて持っているわけない、買えるわけない、買う用事もない。

シカタがないので、エクセルVBAでEnumWindows関数を使う方法を考えてみた。

使用するWin32API関数


IsWindowVisible   表示ウインドウを調べる関数

GetWindowText    ウインドウのキャプションを調べる関数

GetClassName     ウインドウのクラス名を調べる関数

EnumWindows     ウインドウを列挙する関数

EnumWindowsをコールバック関数として定義する方法は下記のように書いてあった

EnumWindowsProc  EnumWindows に呼び出されるコールバック関数

定義	Function EnumWindowsProc(ByVal hWnd As Long, _

			ByVal lParam As Object) As Long
			


Module 1 への記述


Option Explicit

'以下 Win32APIの定義
 Declare Function IsWindowVisible Lib "user32" (ByVal hwnd&) As Long
 Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
	(ByVal hwnd As Long, ByVal lpString As String, _
	ByVal cch As Long) As Long
 Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
    (ByVal hwnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
        Public Const GW_HWNDLAST = 1
        Public Const GW_HWNDNEXT = 2
 Declare Function EnumWindows Lib "user32" _
 	(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
 	
'コールバック関数
Public Function EnumWindowsProc _
		(ByVal Handle As Long, ByVal lParam As Object) As Long

	Dim strClassName As String * 100
	Dim strCaption As String * 80

	If IsWindowVisible(Handle) Then
		GetWindowText Handle, strCaption, Len(strCaption)
			'キャプションを取得する
		GetClassName Handle, strClassName, Len(strClassName)
			'クラス名を取得する

		strCaption = Left(strCaption, InStr(1, strCaption, vbNullChar) - 1)
		strClassName = Left(strClassName, InStr(1, strClassName, vbNullChar) - 1)

			'リストボックスに追加していく
		UserForm1.ComboBox1.AddItem "キャプション_" + strCaption
		UserForm1.ComboBox1.AddItem "  クラス名_" + strClassName

	End If
        
	EnumWindowsProc = True

End Function

UserForm1への記述


Private Sub CommandButton1_Click()	'列挙ボタン
	Dim Ret As Long
		Ret = EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
End Sub

Private Sub CommandButton2_Click()	'削除ボタン
		ComboBox1.Clear
End Sub

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


みんなの更新記事