AuditFlow, OpenSnd_SendToAviso
This commit is contained in:
@@ -2,10 +2,12 @@
|
||||
Imports System.IO
|
||||
Imports System.Net.Mail
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
Imports System.Text
|
||||
Imports System.Windows.Forms
|
||||
Imports ClosedXML.Excel
|
||||
Imports Microsoft.Office.Interop
|
||||
Imports System.IO.Pipes
|
||||
Imports ThoughtWorks.QRCode.Codec
|
||||
|
||||
Public Class cProgramFunctions
|
||||
@@ -853,6 +855,113 @@ BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, [Control], New Object(
|
||||
Return barcode
|
||||
End Function
|
||||
|
||||
Shared Sub SendMessageToAviso(Mssage)
|
||||
|
||||
' AVISO.exe anhand des Namens finden
|
||||
Dim processName As String = "AVISO" ' Name des zu prüfenden Prozesses
|
||||
Dim currentUser As String = Environment.UserName ' Aktuell angemeldeter Benutzer
|
||||
|
||||
' Alle Prozesse abrufen
|
||||
Dim processes = Process.GetProcessesByName(processName)
|
||||
|
||||
' Prozesse des aktuellen Benutzers filtern
|
||||
Dim userProcesses = processes.Where(Function(p) VERAG_PROG_ALLGEMEIN.cProgramFunctions.IsProcessOwnedByUser(p, currentUser))
|
||||
|
||||
If processes.Length > 0 Then
|
||||
For Each Prz In processes
|
||||
' Ermitteln der Prozess-ID des ersten Prozesses
|
||||
Dim targetProcess As Process = Prz
|
||||
Dim processId As Integer = targetProcess.Id
|
||||
|
||||
' Nachricht an den Listener von AVISO senden
|
||||
If VERAG_PROG_ALLGEMEIN.cProgramFunctions.SendMessageToprocessId(processId, Mssage) Then
|
||||
Exit For
|
||||
End If
|
||||
Next
|
||||
Else
|
||||
Console.WriteLine("AVISO ist nicht aktiv.")
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
Shared Function SendMessageToprocessId(processId As Integer, message As String) As Boolean
|
||||
' Named Pipe verwenden
|
||||
Dim pipeName As String = $"AVISO_{processId}"
|
||||
|
||||
Try
|
||||
Using client = New NamedPipeClientStream(".", pipeName, PipeDirection.Out)
|
||||
client.Connect(3000) ' Timeout von 3 Sekunden
|
||||
Using writer = New StreamWriter(client, Encoding.UTF8)
|
||||
writer.AutoFlush = True
|
||||
writer.WriteLine(message)
|
||||
'MsgBox(message)
|
||||
bringToFront(processId)
|
||||
' Application.Exit() #-> Nicht beenden!
|
||||
Return True
|
||||
End Using
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
Console.WriteLine("Fehler beim Senden der Nachricht: " & ex.Message)
|
||||
MsgBox("Fehler beim Senden der Nachricht: " & ex.Message & ex.StackTrace)
|
||||
End Try
|
||||
Return False
|
||||
End Function
|
||||
' Hilfsmethode: Überprüft, ob ein Prozess einem Benutzer gehört
|
||||
Shared Function IsProcessOwnedByUser(proc As Process, userName As String) As Boolean
|
||||
Try
|
||||
Dim query As String = $"SELECT * FROM Win32_Process WHERE ProcessId = {proc.Id}"
|
||||
Using searcher As New System.Management.ManagementObjectSearcher(query)
|
||||
For Each obj As System.Management.ManagementObject In searcher.Get()
|
||||
Dim outParams() As Object = {Nothing, Nothing}
|
||||
obj.InvokeMethod("GetOwner", outParams)
|
||||
If outParams(0) IsNot Nothing AndAlso outParams(0).ToString().Equals(userName, StringComparison.OrdinalIgnoreCase) Then
|
||||
Return True
|
||||
End If
|
||||
Next
|
||||
End Using
|
||||
Catch ex As Exception
|
||||
' Fehler behandeln, z. B. wenn der Prozess nicht zugreifbar ist
|
||||
End Try
|
||||
Return False
|
||||
End Function
|
||||
|
||||
<DllImport("user32.dll")>
|
||||
Private Shared Function ShowWindow(hWnd As IntPtr, nCmdShow As Integer) As Boolean
|
||||
End Function
|
||||
|
||||
Private Shared Function IsIconic(hWnd As IntPtr) As Boolean
|
||||
End Function
|
||||
Private Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean
|
||||
End Function
|
||||
Private Const SW_SHOWNOACTIVATE As Integer = 4
|
||||
Private Const SW_RESTORE As Integer = 9
|
||||
Shared Sub bringToFront(processId)
|
||||
' Prozess finden und in den Vordergrund bringen
|
||||
Try
|
||||
Dim process = System.Diagnostics.Process.GetProcessById(processId)
|
||||
If process IsNot Nothing Then
|
||||
Dim hWnd As IntPtr = process.MainWindowHandle
|
||||
If hWnd <> IntPtr.Zero Then
|
||||
' Wenn minimiert, wiederherstellen
|
||||
If IsIconic(hWnd) Then
|
||||
ShowWindow(hWnd, SW_RESTORE)
|
||||
End If
|
||||
|
||||
' Fenster in den Vordergrund bringenh
|
||||
If Not SetForegroundWindow(hWnd) Then
|
||||
Throw New Exception("Fenster konnte nicht in den Vordergrund gebracht werden.")
|
||||
End If
|
||||
Else
|
||||
Console.WriteLine("Hauptfensterhandle ist nicht verfügbar.")
|
||||
End If
|
||||
Else
|
||||
Console.WriteLine($"Prozess mit ID {processId} nicht gefunden.")
|
||||
End If
|
||||
Catch ex As Exception
|
||||
Console.WriteLine("Fehler beim Senden der Nachricht oder beim Bringen in den Vordergrund: " & ex.Message)
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
|
||||
End Class
|
||||
|
||||
|
||||
Reference in New Issue
Block a user