Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1752 / 13645 ツリー ←次へ | 前へ→

【72142】開いていいるWindowの名前(caption)の取得 亜矢 12/6/7(木) 21:16 質問[未読]
【72144】Re:開いていいるWindowの名前(caption)の... UO3 12/6/7(木) 21:55 発言[未読]
【72146】Re:開いていいるWindowの名前(caption)の... 亜矢 12/6/8(金) 6:48 お礼[未読]
【72168】Re:開いていいるWindowの名前(caption)の... 亜矢 12/6/13(水) 10:40 質問[未読]
【72169】Re:開いていいるWindowの名前(caption)の... ちび坊主 12/6/13(水) 12:32 回答[未読]
【72171】Re:開いていいるWindowの名前(caption)の... 亜矢 12/6/13(水) 13:48 お礼[未読]
【72170】Re:開いていいるWindowの名前(caption)の... UO3 12/6/13(水) 12:59 発言[未読]
【72172】Re:開いていいるWindowの名前(caption)の... 亜矢 12/6/13(水) 13:59 お礼[未読]

【72142】開いていいるWindowの名前(caption)の取...
質問  亜矢  - 12/6/7(木) 21:16 -

引用なし
パスワード
   よろしくお願いします。
エクセルを含めて今開いているWindowsの数と名前(caption)
を取得する方法を教えてください。
 開いているものはエクセル、IE、花子(ジャストシステム)、WEB等々です。
 

【72144】Re:開いていいるWindowの名前(caption)...
発言  UO3  - 12/6/7(木) 21:55 -

引用なし
パスワード
   ▼亜矢 さん:

結構ややこしいけど。
ネットから拾い集めて書いたコードです。
Sheet1 の A列にウィンドウハンドル、B列にクラスコード、C列のキャプションを列挙。

Option Explicit

Private Declare Function GetWindow Lib "USER32" _
  (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "USER32" _
  Alias "GetWindowTextA" (ByVal hWnd As Long, _
  ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function IsWindowVisible Lib "USER32" _
  (ByVal hWnd As Long) As Long
Private Declare Function GetClassName Lib "USER32" _
  Alias "GetClassNameA" (ByVal hWnd As Long, _
  ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  
Private Const GW_HWNDNEXT = 2  '次のウィンドウハンドル取得
Private Const GW_HWNDFIRST = 0 'トップ位置ウィンドウハンドル取得
Private Const GW_OWNER = 4   'オーナーウィンドウハンドル取得

Sub Sample()
  Dim myhWnd As Long
  Dim hWind As Long
  Dim rtn As Long
  Dim myClass As String * 128
  Dim myCaption As String * 128
  Dim i As Long
  
  i = 1
  Sheets("Sheet1").Cells.ClearContents
  
  myhWnd = Application.hWnd  '自分自身のハンドル
  
  hWind = GetWindow(myhWnd, GW_HWNDFIRST)
  Do Until hWind = 0
    If IsWindowVisible(hWind) And GetWindow(hWind, GW_OWNER) = 0 Then 'タスクバーにあるもの
      myClass = ""
      Call GetClassName(hWind, myClass, Len(myClass))
      If Left$(myClass, 7) <> "Progman" Then
        myCaption = ""
        rtn = GetWindowText(hWind, myCaption, Len(myCaption))
        If rtn Then   'キャプションが "" でない場合
          With Sheets("Sheet1")
            .Cells(i, "A").Value = hWind   'ハンドル
            .Cells(i, "B").Value = myClass  'クラス名
            .Cells(i, "C").Value = myCaption  'キャプション
            i = i + 1
          End With
        End If
      End If
    End If
    hWind = GetWindow(hWind, GW_HWNDNEXT)
  Loop
  
End Sub

【72146】Re:開いていいるWindowの名前(caption)...
お礼  亜矢  - 12/6/8(金) 6:48 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:
>
>結構ややこしいけど。
>ネットから拾い集めて書いたコードです。
>Sheet1 の A列にウィンドウハンドル、B列にクラスコード、C列のキャプションを列挙。
 詳しいコードまで提示頂きありがとうございました。
 テストをした結果問題なくcaptionが取得出来ました。
 解決しました。
 

【72168】Re:開いていいるWindowの名前(caption)...
質問  亜矢  - 12/6/13(水) 10:40 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:
>
>結構ややこしいけど。
>ネットから拾い集めて書いたコードです。
>Sheet1 の A列にウィンドウハンドル、B列にクラスコード、C列のキャプションを列挙。
>
>Option Explicit
>
>Private Declare Function GetWindow Lib "USER32" _
>  (ByVal hWnd As Long, ByVal wCmd As Long) As Long
>Private Declare Function GetWindowText Lib "USER32" _
>  Alias "GetWindowTextA" (ByVal hWnd As Long, _
>  ByVal lpString As String, ByVal cch As Long) As Long
>Private Declare Function IsWindowVisible Lib "USER32" _
>  (ByVal hWnd As Long) As Long
>Private Declare Function GetClassName Lib "USER32" _
>  Alias "GetClassNameA" (ByVal hWnd As Long, _
>  ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
>  
>Private Const GW_HWNDNEXT = 2  '次のウィンドウハンドル取得
>Private Const GW_HWNDFIRST = 0 'トップ位置ウィンドウハンドル取得
>Private Const GW_OWNER = 4   'オーナーウィンドウハンドル取得
>
>Sub Sample()
>  Dim myhWnd As Long
>  Dim hWind As Long
>  Dim rtn As Long
>  Dim myClass As String * 128
>  Dim myCaption As String * 128
>  Dim i As Long
>  
>  i = 1
>  Sheets("Sheet1").Cells.ClearContents
>  
>  myhWnd = Application.hWnd  '自分自身のハンドル
>  
>  hWind = GetWindow(myhWnd, GW_HWNDFIRST)
>  Do Until hWind = 0
>    If IsWindowVisible(hWind) And GetWindow(hWind, GW_OWNER) = 0 Then 'タスクバーにあるもの
>      myClass = ""
>      Call GetClassName(hWind, myClass, Len(myClass))
>      If Left$(myClass, 7) <> "Progman" Then
>        myCaption = ""
>        rtn = GetWindowText(hWind, myCaption, Len(myCaption))
>        If rtn Then   'キャプションが "" でない場合
>          With Sheets("Sheet1")
>            .Cells(i, "A").Value = hWind   'ハンドル
>            .Cells(i, "B").Value = myClass  'クラス名
>            .Cells(i, "C").Value = myCaption  'キャプション
>            i = i + 1
>          End With
>        End If
>      End If
>    End If
>    hWind = GetWindow(hWind, GW_HWNDNEXT)
>  Loop
>  
>End Sub
先日上記のコードをいただき一つの目的が達成しましたが、印刷プレビューとか他の子の取得が出来ないと思われますので、子のCaptionが取得できるような方法を
教えて頂きたいと思います。
 よろしくお願いします。

【72169】Re:開いていいるWindowの名前(caption)...
回答  ちび坊主  - 12/6/13(水) 12:32 -

引用なし
パスワード
       EnumChildWindowsとか、FindWindowsEXで再帰かけるとか。

Private Declare Function GetWindowText Lib "user32" _
    Alias "GetWindowTextA" _
    (ByVal hwnd As Long, ByVal lpString As String, _
    ByVal nMaxCount As Long) As Long
Private Declare Function GetClassName Lib "user32" _
    Alias "GetClassNameA" _
    (ByVal hwnd As Long, ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
Private Declare Function FindWindowEx Lib "user32" _
    Alias "FindWindowExA" _
    (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
    ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function IsWindowVisible Lib "user32" _
    (ByVal hwnd As Long) As Long

Private Sub GetChilds(ByVal hwndParent As Long, _
       Optional r As Long, Optional ByVal c As Long = 1)

  Dim h As Long
  Dim sClass As String
  Dim sText As String
  Do
    h = FindWindowEx(hwndParent, h, vbNullString, vbNullString)
    If h = 0 Then Exit Do
    If IsWindowVisible(h) Then
     r = r + 1
 
     sClass = String$(80, 0)
     sText = String$(80, 0)
     GetClassName h, sClass, Len(sClass)
     GetWindowText h, sText, Len(sText) - 1
     sClass = Left$(sClass, InStr(sClass, vbNullChar) - 1)
     sText = Left$(sText, InStr(sText, vbNullChar) - 1)
 
     With ActiveSheet.Cells(r, c)
       .Value = Right$(String$(7, "0") & Hex$(h), 8) & _
             ", " & sClass & ", " & sText
     End With
     sClass = vbNullString: sText = vbNullString
 
     GetChilds h, r, c + 1
    End If
  Loop
End Sub

Sub Test()
  ActiveSheet.Cells.Clear
  GetChilds FindWindowEx(0, 0, "FNWND380", "Main_Window")
End Sub

【72170】Re:開いていいるWindowの名前(caption)...
発言  UO3  - 12/6/13(水) 12:59 -

引用なし
パスワード
   ▼亜矢 さん:

こんにちは
この道の権威のちび坊主さんがおでましになられたので、私なんぞの出る幕ではありませんが
私のコードでいえば、メインタスクのみを抽出するためのチェックをしているところを
はずせばいいかと思います。
ただ、そうするとどっさりでますので、非表示タスクはカットしますと、

    If IsWindowVisible(hWind) And GetWindow(hWind, GW_OWNER) = 0 Then 'タスクバーにあるもの

これを

    If IsWindowVisible(hWind) Then '表示されているもの

このようにかえればいかがでしょう。

【72171】Re:開いていいるWindowの名前(caption)...
お礼  亜矢  - 12/6/13(水) 13:48 -

引用なし
パスワード
   ▼ちび坊主 さん:
>    EnumChildWindowsとか、FindWindowsEXで再帰かけるとか。
>
>Private Declare Function GetWindowText Lib "user32" _
>    Alias "GetWindowTextA" _
>    (ByVal hwnd As Long, ByVal lpString As String, _
>    ByVal nMaxCount As Long) As Long
>Private Declare Function GetClassName Lib "user32" _
>    Alias "GetClassNameA" _
>    (ByVal hwnd As Long, ByVal lpClassName As String, _
>    ByVal nMaxCount As Long) As Long
>Private Declare Function FindWindowEx Lib "user32" _
>    Alias "FindWindowExA" _
>    (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
>    ByVal lpszClass As String, ByVal lpszWindow As String) As Long
>Private Declare Function IsWindowVisible Lib "user32" _
>    (ByVal hwnd As Long) As Long
>
>Private Sub GetChilds(ByVal hwndParent As Long, _
>       Optional r As Long, Optional ByVal c As Long = 1)
>
>  Dim h As Long
>  Dim sClass As String
>  Dim sText As String
>  Do
>    h = FindWindowEx(hwndParent, h, vbNullString, vbNullString)
>    If h = 0 Then Exit Do
>    If IsWindowVisible(h) Then
>     r = r + 1
> 
>     sClass = String$(80, 0)
>     sText = String$(80, 0)
>     GetClassName h, sClass, Len(sClass)
>     GetWindowText h, sText, Len(sText) - 1
>     sClass = Left$(sClass, InStr(sClass, vbNullChar) - 1)
>     sText = Left$(sText, InStr(sText, vbNullChar) - 1)
> 
>     With ActiveSheet.Cells(r, c)
>       .Value = Right$(String$(7, "0") & Hex$(h), 8) & _
>             ", " & sClass & ", " & sText
>     End With
>     sClass = vbNullString: sText = vbNullString
> 
>     GetChilds h, r, c + 1
>    End If
>  Loop
>End Sub
>
>Sub Test()
>  ActiveSheet.Cells.Clear
>  GetChilds FindWindowEx(0, 0, "FNWND380", "Main_Window")
>End Sub
早速のご指導ありがとうございました。目的は達成できました。

【72172】Re:開いていいるWindowの名前(caption)...
お礼  亜矢  - 12/6/13(水) 13:59 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:
>
>こんにちは
>この道の権威のちび坊主さんがおでましになられたので、私なんぞの出る幕ではありませんが
>私のコードでいえば、メインタスクのみを抽出するためのチェックをしているところを
>はずせばいいかと思います。
>ただ、そうするとどっさりでますので、非表示タスクはカットしますと、
>
>    If IsWindowVisible(hWind) And GetWindow(hWind, GW_OWNER) = 0 Then 'タスクバーにあるもの
>
>これを
>
>    If IsWindowVisible(hWind) Then '表示されているもの
>
>このようにかえればいかがでしょう。
ありがとうございました。上記の様に変更したら解決しました。
 今後もよろしくお願いします。

1752 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free