hWnd для каждого процесса XL;каждый процесс находится на вершине Z-порядка - PullRequest
0 голосов
/ 16 августа 2011

Это последовательно активирует каждый процесс XL, который работает:

    Public Sub Test()
     Dim varAry()
     Dim iInstances As Long
     Dim hWndDesk As Long
     Dim hWndXL As Long
     Dim x As Long
     Dim var As Variant

     On Error Resume Next

    '---
     hWndDesk = GetDesktopWindow

     Do
      iInstances = iInstances + 1
      hWndXL = FindWindowEx(GetDesktopWindow, hWndXL, "XLMAIN", vbNullString)

      If hWndXL <> 0 Then
       ReDim Preserve varAry(iInstances)
    'Get the next Excel window
       varAry(iInstances) = hWndXL
      Else
       Exit Do
      End If
     Loop

    '---
     For x = 1 To UBound(varAry)
      MsgBox varAry(x)
      var = SwitchToThisWindow(hwnd:=varAry(x), BOOL:=False)
     Next x
exit_Sub
    End Sub

Но GetObject () не может применяться последовательно к каждому из активированных процессов. Я хотел бы использовать такой объект для подсчета количества рабочих книг, открытых под каждым процессом.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 17 августа 2011

Приведенный ниже код будет вычислять количество найденных «родительских» классов.

Imports System.Runtime.InteropServices

Public Class Form1
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As IntPtr
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
                      ByVal childAfter As IntPtr, _
                      ByVal lclassName As String, _
                      ByVal windowTitle As String) As IntPtr
    End Function
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim handleCount As Integer
        Dim hWnd As IntPtr
        'ConsoleWindowClass is for "Command Prompt" / cmd.exe in Windows.
        hWnd = FindWindow("ConsoleWindowClass", vbNullString)
        If hWnd.ToInt32 <> 0 Then handleCount += 1

        Do
            hWnd = FindWindowEx(0, hWnd, "ConsoleWindowClass", vbNullString)
            If hWnd.ToInt32 <> 0 Then
                handleCount += 1
            Else
                Exit Do
            End If

        Loop

        MessageBox.Show("Found " & handleCount.ToString() & " handles...", "Results", MessageBoxButtons.OK, MessageBoxIcon.Information)

    End Sub

End Class

Исторически я всегда использовал Пэт или JK API Spy (с '98 илипоэтому) для получения дружественного представления VBA / 6 о том, как получить дескриптор окна (генерирует для вас код vb, рекомендовал бы его редактировать)

pInvoke.net - отличный ресурс длявсе Win32 API, такие как FindWindow и FindWindowEx , используемые в примере выше.Проверьте ссылки для каждой из них, поскольку они являются обширными примерами того, как правильно реализовать функции.

...