AuditFlow, OpenSnd_SendToAviso

This commit is contained in:
2025-09-03 14:21:50 +02:00
parent 21a1236ca5
commit 9513240844
18 changed files with 1755 additions and 1195 deletions

View File

@@ -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