You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

522 lines
19 KiB

Imports System
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Threading
Imports System.IO
Public Class ApplicationFileWatcher_X
#Region "Deklarationen"
Private m_isActive As Boolean
Public Event DocumentClosed()
Private m_Filename As String
Property Filename() As String
Get
Return m_Filename
End Get
Set(ByVal Value As String)
m_Filename = Value
End Set
End Property
Private m_ApplicationType As Integer
Property ApplicationType()
Get
Return m_ApplicationType
End Get
Set(ByVal Value)
m_ApplicationType = Value
End Set
End Property
Private m_Applicationname As String
Property Appname() As String
Get
Return m_Applicationname
End Get
Set(ByVal Value As String)
m_Applicationname = Value
End Set
End Property
Private m_WindowNameDC As String
Property WindowNameDC() As String
Get
Return m_WindowNameDC
End Get
Set(ByVal Value As String)
m_WindowNameDC = Value
End Set
End Property
Private m_WindowName As String
Property WindowName() As String
Get
Return m_WindowName
End Get
Set(ByVal Value As String)
m_WindowName = Value
End Set
End Property
'Rel. Office 2010
Private m_WindowNameKomp As String
Property WindowNameKompatibilitaet() As String
Get
Return m_WindowNameKomp
End Get
Set(ByVal value As String)
m_WindowNameKomp = value
End Set
End Property
Private m_WindowNamePreview As String
Property WindowNamePreview() As String
Get
Return m_WindowNamePreview
End Get
Set(ByVal Value As String)
m_WindowNamePreview = Value
End Set
End Property
Dim m_processid As Long
Property ProcessID As Long
Get
Return m_processid
End Get
Set(value As Long)
m_processid = value
End Set
End Property
Dim m_dokumentid As String
Property Dokumentid As String
Get
Return m_dokumentid
End Get
Set(value As String)
m_dokumentid = value
End Set
End Property
Const STRING_BUFFER_LENGTH As Integer = 255
Dim WindowArray As New ArrayList()
Dim WithEvents MyTimer As New System.Timers.Timer(1000)
Dim Office2016Names As New List(Of String)
#End Region
#Region "<22>ffentliche Methoden"
Public Sub New()
End Sub
Public Sub New(ByVal typ As Integer, ByVal DocFileName As String)
MyBase.New()
End Sub
Public Sub Dispose()
Me.WindowArray = Nothing
End Sub
Public Sub Start()
AddHandler MyTimer.Elapsed, AddressOf TimerFired
SetWindowName()
MyTimer.Start()
End Sub
Public Sub Stopp()
Me.MyTimer.Stop()
End Sub
Public Sub BringWindowToTop()
Dim i As Integer
SetWindowName()
i = Win32API.FindWindow(vbNullString, Me.WindowName)
If i <> 0 Then
i = Win32API.SetForegroundWindow(i)
i = Win32API.ShowWindow(i, Win32API.SW_RESTORE)
End If
End Sub
Public Function doc_is_active() As Boolean
Dim Docfound As Boolean = False
Try
Dim p As Process = Process.GetProcessById(Me.ProcessID)
If p.Id = Me.ProcessID Then
If GetHandle(Me.Dokumentid) <> 0 Then Docfound = True
If p.Id = 0 Then Docfound = False
End If
Catch ex As Exception
Docfound = False
End Try
Return Docfound
Exit Function
'Dim I As Integer
'Search_List()
'For I = 0 To Me.WindowArray.Count - 1
' If Me.WindowArray.Item(I) = Me.WindowName Then doc_is_active = True
'Next
Dim I As Integer
'20200901 - Clear WindowWarray
Me.WindowArray.Clear()
Search_List()
If Globals.UseOffice2016 = False Then
For I = 0 To Me.WindowArray.Count - 1
If Me.WindowArray.Item(I) = Me.WindowName Then doc_is_active = True
Next
End If
If Globals.UseOffice2016 = True Then
For I = 0 To Me.WindowArray.Count - 1
For x As Integer = 0 To Me.Office2016Names.Count - 1
If Me.WindowArray.Item(I).ToString <> "" And Me.WindowArray.Item(I) = Me.Office2016Names.Item(x) Then
doc_is_active = True
Try
If Globals.Office2016Debug = True Then
FileOpen(7, "h:\office2016Windowlist.txt", OpenMode.Append)
WriteLine(7, "--->Is Active:" + Me.WindowArray.Item(I).ToString + "/" + Me.Office2016Names.Item(x))
FileClose(7)
End If
Catch EX As Exception
End Try
End If
Next
Next
End If
End Function
#End Region
#Region "Private Methoden"
Public Function GetHandle(ByVal caption As String) As String
Try
For i As Integer = 1 To Globals.try_count_search
If ApplicationType = 1 Then
For Each p As Process In Process.GetProcessesByName("winword")
If p.MainWindowTitle.IndexOf(caption) > -1 Then
Return p.Id.ToString
Exit Function
End If
Next
End If
If ApplicationType = 2 Then
For Each p As Process In Process.GetProcessesByName("excel")
If p.MainWindowTitle.IndexOf(caption) > -1 Then
Return p.Id.ToString
Exit Function
End If
Next
End If
If Me.ApplicationType <> 1 And Me.ApplicationType <> 2 Then
For Each p As Process In Process.GetProcesses
If p.MainWindowTitle.IndexOf(caption) > -1 Then
Return p.Id.ToString
Exit Function
End If
Next
End If
Thread.Sleep(500)
Next i
Return 0
Catch ex As Exception
PerfMon.force_insert_entry(Me.Dokumentid + ": Prozess-ID konnte nicht ermittelt werden: " + ex.Message)
End Try
End Function
Public Sub SetWindowName()
'Select Case Me.ApplicationType
' Case 1 'Word
' Me.WindowName = Me.Filename + " - Microsoft Word"
' Me.WindowNameKompatibilitaet = Me.Filename + " [Kompatibilit<69>tsmodus] - Microsoft Word"
' Me.WindowNamePreview = Me.Filename + " (Seitenansicht) - Microsoft Word"
' Me.WindowNameDC = Me.Filename + " - DC"
' Case 2 'Excel
' Me.WindowName = "Microsoft Excel - " & Me.Filename
' Me.WindowNameKompatibilitaet = "Microsoft Excel - " & Me.Filename + " [Kompatibilit<69>tsmodus]"
' Me.WindowNamePreview = "Microsoft Excel - " & Me.Filename
' Me.WindowNameDC = Me.Filename + ""
' Case 3
' Me.WindowName = Me.Filename + " - Adobe Reader"
' Me.WindowNameKompatibilitaet = Me.Filename + " - Adobe Reader"
' Me.WindowNamePreview = Me.Filename + " - Adobe Reader"
' Me.WindowNameDC = Me.Filename + ""
' Case 4
' Me.WindowName = Me.WindowName
' Me.WindowNamePreview = Me.WindowNamePreview
' Me.WindowNameDC = Me.Filename + ""
' Case Else
' 'MsgBox("Hallo")
'End Select
If Globals.Office2010WatchFIles.Rows.Count = 0 Then
DivFnkt.Get_Office2016_Params()
End If
If Globals.UseOffice2016 = False Then
Select Case Me.ApplicationType
Case 1 'Word
Me.WindowName = Me.Filename + " - Microsoft Word"
Me.WindowNameKompatibilitaet = Me.Filename + " [Kompatibilit<69>tsmodus] - Microsoft Word"
Me.WindowNamePreview = Me.Filename + " (Seitenansicht) - Microsoft Word"
Me.WindowNameDC = Me.Filename + " - DC"
Case 2 'Excel
Me.WindowName = "Microsoft Excel - " & Me.Filename
Me.WindowNameKompatibilitaet = "Microsoft Excel - " & Me.Filename + " [Kompatibilit<69>tsmodus]"
Me.WindowNameKompatibilitaet = Me.Filename + " [Kompatibilit<69>tsmodus] - Excel"
Me.WindowNamePreview = "Microsoft Excel - " & Me.Filename
Me.WindowNameDC = Me.Filename + ""
Case 3
Me.WindowName = Me.Filename + " - Adobe Reader"
Me.WindowNameKompatibilitaet = Me.Filename + " - Adobe Reader"
Me.WindowNamePreview = Me.Filename + " - Adobe Reader"
Me.WindowNameDC = Me.Filename + ""
Case 4
Me.WindowName = Me.WindowName
Me.WindowNamePreview = Me.WindowNamePreview
Me.WindowNameDC = Me.Filename + ""
Case Else
'MsgBox("Hallo")
End Select
End If
If Globals.UseOffice2016 = True Then
For Each r As DataRow In Globals.Office2010WatchFIles.Rows
Select Case ApplicationType
Case 1 'word
If r("applikation") = "Word" Then
If r.Item(0) = 1 Then Me.WindowName = r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename)
Me.Office2016Names.Add(r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename))
End If
Case 2 'Excel
If r("applikation") = "Excel" Then
If r.Item(0) = 10 Then Me.WindowName = r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename)
Me.Office2016Names.Add(r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename))
End If
Case 3 'Acrobat
If r("applikation") = "Adobe" Then
If r.Item(0) = 20 Then Me.WindowName = r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename)
Me.Office2016Names.Add(r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename))
End If
Case Else
Me.Office2016Names.Add(r.Item("WindowName").ToString.Replace("[Filename]", Me.Filename))
End Select
Next
End If
End Sub
Public Function getWindowName() As String
Return Me.WindowName
End Function
'Public Sub TimerFired(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles MyTimer.Elapsed
' MyTimer.Stop()
' 'Dim sW As New StreamWriter("D:\TRACE.LOG", True)
' 'sW.WriteLine(Now)
' Dim DocFound As Boolean = False
' Dim i As Integer
' Dim zz As Integer = 0
' 'While zz < 3 And DocFound = False
' Me.WindowArray.Clear()
' Search_List()
' For i = 0 To Me.WindowArray.Count - 1
' 'sW.WriteLine(Me.WindowName + ":" + Me.WindowArray.Item(i))
' 'If Me.WindowArray.Item(i) = Me.WindowName Then MsgBox("Ist aktiv")
' If Me.WindowArray.Item(i) = Me.WindowName Then DocFound = True
' If Me.WindowArray.Item(i) = Me.WindowNamePreview Then DocFound = True
' If Me.WindowArray.Item(i) = Me.WindowNameDC Then DocFound = True
' If Me.WindowArray.Item(i) = Me.WindowNameKompatibilitaet Then DocFound = True
' Next
' 'zz = zz + 1
' ' Thread.Sleep(300)
' ' 'End While
' ' Thread.Sleep(300)
' If Not DocFound Then
' Dim fn As String = Globals.Applikationsdaten.Rows(Globals.AppldataRow).Item("pfad_temporaer_dokumente") + "~$" + Microsoft.VisualBasic.Right(Me.Filename, Len(Me.Filename) - 2)
' Dim fc As New FileInfo(fn)
' If fc.Exists Then DocFound = True
' If Not DocFound Then
' ' sW.WriteLine("Stop:" + Me.WindowName)
' MyTimer.Stop()
' RaiseEvent DocumentClosed()
' Else
' MyTimer.Start()
' End If
' Else
' MyTimer.Start()
' End If
' DocFound = Nothing
' ' sW.WriteLine(Now)
' ' sW.Flush()
' ' sW.Close()
'End Sub
'Public Sub TimerFired1(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles MyTimer.Elapsed
' MyTimer.Stop()
' Dim DocFound As Boolean = False
' Dim i As Integer
' Dim zz As Integer = 0
' Me.WindowArray.Clear()
' Search_List()
' Try
' If Globals.Office2016Debug = True Then FileOpen(7, "h:\office2016Windowlist.txt", OpenMode.Append)
' Catch EX As Exception
' End Try
' Try
' For i = 0 To Me.WindowArray.Count - 1
' If Globals.UseOffice2016 = False Then
' If Me.WindowArray.Item(i) = Me.WindowName Then DocFound = True
' If Me.WindowArray.Item(i) = Me.WindowNamePreview Then DocFound = True
' If Me.WindowArray.Item(i) = Me.WindowNameDC Then DocFound = True
' If Me.WindowArray.Item(i) = Me.WindowNameKompatibilitaet Then DocFound = True
' End If
' If Globals.Office2016Debug = True Then
' WriteLine(7, "EDOKA:-----------------------------------------------")
' End If
' If Globals.UseOffice2016 = True Then
' For x As Integer = 0 To Me.Office2016Names.Count - 1
' If Globals.Office2016Debug = True Then
' WriteLine(7, "EDOKA:" + Me.Office2016Names.Item(x).ToString + " - " + Me.Office2016Names.Count.ToString)
' End If
' If Me.WindowArray.Item(i).ToString <> "" And Me.WindowArray.Item(i) = Me.Office2016Names.Item(x) Then
' DocFound = True
' If Globals.Office2016Debug = True Then
' WriteLine(7, "--->DocFound:" + Me.WindowArray.Item(i).ToString + "/" + Me.Office2016Names.Item(x))
' End If
' Exit For
' End If
' Next
' If DocFound Then Exit For
' End If
' Try
' If Globals.Office2016Debug = True Then
' WriteLine(7, Me.WindowArray.Item(i))
' End If
' Catch
' End Try
' Next
' Catch ex As Exception
' End Try
' If Globals.Office2016Debug = True Then
' Try
' For i = 1 To 100000
' Application.DoEvents()
' Next
' FileClose(7)
' Catch
' End Try
' End If
' If Not DocFound Then
' Dim fn As String = Globals.Applikationsdaten.Rows(Globals.AppldataRow).Item("pfad_temporaer_dokumente") + "~$" + Microsoft.VisualBasic.Right(Me.Filename, Len(Me.Filename) - 2)
' Dim fc As New FileInfo(fn)
' If fc.Exists Then DocFound = True
' If Not DocFound Then
' ' sW.WriteLine("Stop:" + Me.WindowName)
' MyTimer.Stop()
' GC.Collect()
' GC.WaitForPendingFinalizers()
' GC.Collect()
' GC.WaitForPendingFinalizers()
' RaiseEvent DocumentClosed()
' Else
' MyTimer.Start()
' End If
' Else
' MyTimer.Start()
' End If
' DocFound = Nothing
'End Sub
Public Sub TimerFired(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles MyTimer.Elapsed
MyTimer.Stop()
Dim DocFound As Boolean = False
Dim i As Integer = 0
Try
Dim p As Process = Process.GetProcessById(Me.ProcessID)
If p.Id = Me.ProcessID Then DocFound = True
Catch ex As Exception
DocFound = False
End Try
If ApplicationType = 3 Then
If GetHandle(Me.Dokumentid) > 0 Then DocFound = True Else DocFound = False
End If
If Not DocFound Then
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
RaiseEvent DocumentClosed()
Else
MyTimer.Start()
End If
DocFound = Nothing
End Sub
Private Sub Search_List()
Win32API.EnumWindowsDllImport(New Win32API.EnumWindowsCallback(AddressOf _
FillActiveWindowsList), 0)
'20200901 - Wait afrer Fill
Thread.Sleep(Globals.wait_after_searchlist)
End Sub
Function FillActiveWindowsList(ByVal hWnd As Integer, ByVal lParam As Integer) As Boolean
Dim windowText As New StringBuilder(STRING_BUFFER_LENGTH)
Win32API.GetWindowText(hWnd, windowText, STRING_BUFFER_LENGTH)
If ProcessIsActiveWindow(hWnd) Then
Me.WindowArray.Add(windowText.ToString)
End If
Return True
End Function
Function ProcessIsActiveWindow(ByVal hWnd As Integer) As Boolean
Dim windowText As New StringBuilder(STRING_BUFFER_LENGTH)
Dim windowIsOwned As Boolean
Dim windowStyle As Integer
Win32API.GetWindowText(hWnd, windowText, STRING_BUFFER_LENGTH)
windowIsOwned = Win32API.GetWindow(hWnd, Win32API.GW_OWNER) <> 0
windowStyle = Win32API.GetWindowLong(hWnd, Win32API.GWL_EXSTYLE)
Return True
If Not Win32API.IsWindowVisible(hWnd) Then
Return False
End If
If windowText.ToString.Equals("") Then
Return False
End If
If Win32API.GetParent(hWnd) <> 0 Then
Return False
End If
If (windowStyle And Win32API.WS_EX_TOOLWINDOW) <> 0 And Not windowIsOwned Then
Return False
End If
If (windowStyle And Win32API.WS_EX_APPWINDOW) = 0 And windowIsOwned Then
Return False
End If
Return True
End Function
#End Region
End Class