2011-08-16 3 views
0

의 상단에이 연속적으로 실행하는 일마다 XL 과정 활성화 :각 XL 프로 시저에 대한 hWnd; 각 시저는 Z 순서

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

저에게 경고 해 주셔서 감사합니다. 나는 그것을 준비하고 그것을 일찍 제출했지만 나중에 게시하지 않은 것으로 나타났습니다. 다시 시도하기 위해 다시 열었을 때 최종 편집 내용이 없다는 사실을 알지 못했습니다. –

+0

"자동화하려는 응용 프로그램의 여러 인스턴스가 실행중인 경우 GetObject 함수가 반환 할 인스턴스를 보장 할 수있는 방법이 없습니다." http://msdn.microsoft.com/en-us/library/aa164798(v=office.10).aspx –

답변

0

아래 코드 발견 "부모"클래스의 수를 계산합니다.

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 

은 역사적으로 항상 창 핸들을 얻는 방법의 VBA/6 친화적 인 뷰를 얻기 위해 (때문에 '98 년 이후 나) Pat or JK's API Spy을 사용했습니다

(당신을 위해 VB 코드를 생성하지만 편집을 추천 할 것입니다)

pInvoke.net은 위 예제에서 사용 된 FindWindowFindWindowEx과 같은 모든 Win32 API에 대한 유용한 리소스입니다. 기능을 제대로 구현하는 방법에 대한 광범위한 예제가 있으므로 링크를 확인하십시오.