Imports System.Threading Imports System.IO Imports System.Globalization Imports DD_Clipboard_Watcher.ClassConstants Imports DD_Clipboard_Watcher.ClassWindowAPI Public Class frmStart Dim WithEvents Hotkey As New ClassHotkey(Me) Private WithEvents _Watcher As ClipboardWatcher = ClipboardWatcher.Singleton Public Sub New() ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. Dim splash As New frmSplash() splash.ShowDialog() If ERROR_INIT <> "INVALID USER" Then Dim cultureInfo As New CultureInfo(USER_LANGUAGE) Thread.CurrentThread.CurrentCulture = cultureInfo Thread.CurrentThread.CurrentUICulture = cultureInfo CultureInfo.DefaultThreadCurrentCulture = cultureInfo CultureInfo.DefaultThreadCurrentUICulture = cultureInfo End If End Sub Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load ClassWindowLocation.LoadFormLocationSize(Me) If ERROR_INIT = "FAILED DBCONNECTION" Or ERROR_INIT = "DATABASE" Then frmConfig_Basic.ShowDialog() End If If Database.DBInitialized = True Then If ERROR_INIT <> "" Then If ERROR_INIT = "NO CLIENT" Then MsgBox("You are not related to a client!" & vbNewLine & "Please contact the system administrator!", MsgBoxStyle.Exclamation) Else MsgBox("Sorry Something went wrong in user configuration!" & vbNewLine & "Reason: " & ERROR_INIT & vbNewLine & "Please contact the system administrator!", MsgBoxStyle.Exclamation) End If Exit Sub End If NotifyIconMain.Visible = True ClassInit.Refresh_Profile_Links() ClassInit.Refresh_Connections() Hotkey.AddHotKey(Keys.T, ClassHotkey.ModfierKey.MOD_CONTROL, HOTKEY_TOGGLE_WATCHER) Dim oKeyCode As Keys Dim oConverter As New KeysConverter Dim oObject As Object = oConverter.ConvertFromString(HotkeySearchKey.ToUpper) oKeyCode = CType(oObject, Keys) If HotkeyFunctionKey = HOTKEY_CTRL Then Hotkey.AddHotKey(oKeyCode, ClassHotkey.ModfierKey.MOD_CONTROL, ClassConstants.HOTKEY_TRIGGER_WATCHER) ElseIf HotkeyFunctionKey = HOTKEY_SHIFT Then Hotkey.AddHotKey(oKeyCode, ClassHotkey.ModfierKey.MOD_SHIFT, ClassConstants.HOTKEY_TRIGGER_WATCHER) End If End If labelUser.Text = String.Format(labelUser.Text, USER_USERNAME) labelHotkey.Text = String.Format(labelHotkey.Text, $"{HotkeyFunctionKey.ToUpper}+{HotkeySearchKey.ToUpper}") End Sub Private Sub frmMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing Logger.Info(">> Logout time: " & Now.ToString, False) If ERROR_INIT = "INVALID USER" Or ERROR_INIT = "NO CLIENT" Then Exit Sub End If Try Dim sql = "DELETE FROM TBDD_USER_MODULE_LOG_IN WHERE USER_ID = " & USER_ID & " AND UPPER(MODULE) = UPPER('Clipboard-Watcher')" Database.ExecuteNonQuery(sql) ClassWindowLocation.SaveFormLocationSize(Me, "") My.Settings.Save() Catch ex As Exception End Try Try Hotkey.RemoveHotKey(HOTKEY_TOGGLE_WATCHER) Hotkey.RemoveHotKey(HOTKEY_TRIGGER_WATCHER) Catch ex As Exception Logger.Error(ex) Logger.Warn("Hotkeys could not be removed") End Try 'TempDateien löschen For Each oFile In TEMP_FILES Try File.Delete(oFile) Catch ex As Exception Logger.Warn("Temp file {0} could not be deleted", oFile) Logger.Error(ex) End Try Next End Sub Private Sub frmClipboardWatch_Disposed(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Disposed _Watcher.Dispose() End Sub Private Sub WatcherChanged_New(ByVal sender As Object, ByVal e As EventArgs) Handles _Watcher.Changed If MONITORING_ACTIVE = False Then NotifyIconMain.ShowBalloonTip(20000, "Clipboard Watcher", "Clipboard-watcher is inactive.", ToolTipIcon.Info) Exit Sub End If If DT_USER_PROFILES Is Nothing OrElse DT_USER_PROFILES.Rows.Count = 0 Then Logger.Warn("DT_USER_PROFILES is empty!") Exit Sub End If If DTPROFILE_REL_PROCESS Is Nothing OrElse DTPROFILE_REL_PROCESS.Rows.Count = 0 Then Logger.Warn("DTPROFILE_REL_PROCESS is empty!") Exit Sub End If If DTPROFILE_REL_WINDOW Is Nothing OrElse DTPROFILE_REL_WINDOW.Rows.Count = 0 Then Logger.Warn("DTPROFILE_REL_WINDOW is empty!") Exit Sub End If If DTPROFILE_REL_CONTROL Is Nothing OrElse DTPROFILE_REL_CONTROL.Rows.Count = 0 Then Logger.Warn("DTPROFILE_REL_CONTROL is empty!") Exit Sub End If Dim oWindowInfo = GetWindowInfo() Dim ClipboardContents As String = Clipboard.GetText() Dim oProfileFilter As ClassProfileFilter Dim oFocusedControl As IntPtr = FocusedControlinActiveWindow(Handle) Try CurrMatchTreeView.Nodes.Clear() CurrMatchTreeView.ImageList = ImageList1 CurrMatchTreeView.SelectedImageIndex = 0 oProfileFilter = New ClassProfileFilter( DT_USER_PROFILES, DTPROFILE_REL_PROCESS, DTPROFILE_REL_WINDOW, DTPROFILE_REL_CONTROL, CurrMatchTreeView) Catch ex As Exception Logger.Error(ex) MsgBox("Fehler beim Laden der Profile. Möglicherweise liegt ein Konfigurationsfehler vor. Mehr Informationen im Log.", MsgBoxStyle.Critical, Text) Exit Sub End Try Try Dim oProfiles = oProfileFilter.Profiles.AsEnumerable() oProfiles = oProfileFilter.FilterProfilesByClipboardRegex(oProfiles, ClipboardContents) oProfiles = oProfileFilter.FilterProfilesByProcess(oProfiles, oWindowInfo.ProcessName) oProfiles = oProfileFilter.FilterWindowsByWindowTitleRegex(oProfiles, oWindowInfo.WindowTitle) oProfiles = oProfileFilter.FilterProfilesByFocusedControlLocation(oProfiles, ClipboardContents, Handle) oProfiles = oProfileFilter.ClearNotMatchedProfiles(oProfiles) oProfiles = oProfileFilter.ClearDuplicateProfiles(oProfiles) oProfiles = oProfiles.ToList() CURRENT_MATCHING_PROFILES = oProfiles CURRENT_CLIPBOARD_CONTENTS = ClipboardContents Catch ex As Exception MsgBox("Fehler beim Auswerten der Profile. Mehr Informationen im Log.") Logger.Error(ex) End Try End Sub Private Sub ReceiveHotKey(ByVal HotKeyID As String) Handles Hotkey.HotKeyPressed If HotKeyID = HOTKEY_TRIGGER_WATCHER Then If CURRENT_CLIPBOARD_CONTENTS IsNot Nothing Then If CURRENT_MATCHING_PROFILES.Count > 0 And MONITORING_ACTIVE = True Then CHECK_PROFILE_MATCH() End If End If ElseIf HotKeyID = HOTKEY_TOGGLE_WATCHER Then Change_Monitoring_State() End If End Sub Sub CHECK_PROFILE_MATCH() Dim oProfiles = CURRENT_MATCHING_PROFILES Dim oInvalidDocumentSQL = False Dim oInvalidDataSQL = False For Each oProfile In oProfiles Dim oResultDocs As Integer = 0 Dim oResultData As Integer = 0 Dim oDataSearches As DataTable = Database.GetDatatable($"SELECT COUNT_COMMAND FROM TBCW_PROF_DATA_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID = {oProfile.Guid}") Dim oDocSearches As DataTable = Database.GetDatatable($"SELECT COUNT_COMMAND FROM TBCW_PROF_DOC_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID = {oProfile.Guid}") For Each oRow As DataRow In oDataSearches.Rows Dim oCountCommand = String.Empty Try oCountCommand = oRow.Item("COUNT_COMMAND") If oCountCommand = String.Empty Then Continue For End If oCountCommand = clsPatterns.ReplaceAllValues(oCountCommand, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_EMAIL, USER_ID, oProfile.Guid) oResultData += Database.NewExecuteScalar(oCountCommand) Catch ex As Exception Logger.Warn("Invalid SQL Query for Counting Data in Profile {0}: {1}", oProfile.Guid, oCountCommand) oInvalidDataSQL = True End Try Next For Each oRow As DataRow In oDocSearches.Rows Dim oCountCommand = String.Empty Try oCountCommand = oRow.Item("COUNT_COMMAND") If oCountCommand = String.Empty Then Continue For End If oCountCommand = clsPatterns.ReplaceAllValues(oCountCommand, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_EMAIL, USER_ID, oProfile.Guid) oResultDocs += Database.NewExecuteScalar(oCountCommand) Catch ex As Exception Logger.Warn("Invalid SQL Query for Counting Data in Profile {0}: {1}", oProfile.Guid, oCountCommand) oInvalidDocumentSQL = True End Try Next oProfile.CountData = oResultData oProfile.CountDocs = oResultDocs Next If oInvalidDocumentSQL Or oInvalidDataSQL Then MsgBox("Ein oder mehrere Abfragen konnten nicht ausgeführt werden. Bitte überprüfen Sie das Log.", MsgBoxStyle.Exclamation, "Warnung") Exit Sub End If Dim oForm As New frmProfileMatch() oForm.ShowDialog() End Sub Sub Change_Monitoring_State() If MONITORING_ACTIVE = True Then NotifyIconMain.ShowBalloonTip(30000, "Clipboard Watcher", "Clipboard-Watcher wurde deaktiviert!", ToolTipIcon.Info) MONITORING_ACTIVE = False Else MONITORING_ACTIVE = True NotifyIconMain.ShowBalloonTip(30000, "Clipboard Watcher", "Clipboard-Watcher wurde wieder aktiviert!", ToolTipIcon.Info) End If End Sub Private Sub frmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown If ERROR_INIT <> "INVALID USER" And LICENSE_COUNT > 0 Then If DT_USER_PROFILES.Rows.Count >= 1 Then Hide() End If Else If USER_IS_ADMIN = True And ERROR_INIT = "NO LICENSE" Then MsgBox("As an admin You have access! Please inform Digital Data to add a valid license!", MsgBoxStyle.Exclamation, "No valid License") Else If Not USER_IS_ADMIN Then MsgBox("Application will close now!", MsgBoxStyle.Critical, "No valid License") Close() End If End If End If If USER_IS_ADMIN = True Then btnAdminConfig.Visible = True End If TimerRefresh.Start() End Sub Private Sub NotifyIcon1_DoubleClick(sender As Object, e As EventArgs) Handles NotifyIconMain.DoubleClick OpenClose() End Sub Sub OpenClose() If Visible = False Then BringToFront() Visible = True TimerClose.Start() Else Hide() NotifyIconMain.Visible = True End If End Sub Private Sub frmMain_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp If e.KeyCode = Keys.F12 And USER_IS_ADMIN = True Then frmLicense.ShowDialog() End If End Sub Private Sub tsmiChangeState_Click(sender As Object, e As EventArgs) Handles tsmiChangeState.Click If tsmiChangeState.Tag = "stop" Then tsmiChangeState.Tag = "start" tsmiChangeState.Image = My.Resources.control_start_blue tsmiChangeState.Text = "Überwachung Clipboard starten" MONITORING_ACTIVE = False NotifyIconMain.ShowBalloonTip(30000, "Clipboard Watcher", "Clipboard-Watcher wurde inaktiviert!", ToolTipIcon.Info) Else tsmiChangeState.Image = My.Resources.StatusAnnotations_Stop_16xLG tsmiChangeState.Tag = "stop" tsmiChangeState.Text = "Überwachung Clipboard stoppen" MONITORING_ACTIVE = True NotifyIconMain.ShowBalloonTip(30000, "Clipboard Watcher", "Clipboard-Watcher wurde wieder aktiviert!", ToolTipIcon.Info) End If End Sub Private Sub TimerClose_Tick(sender As Object, e As EventArgs) Handles TimerClose.Tick Hide() End Sub Private Sub frmMain_VisibleChanged(sender As Object, e As EventArgs) Handles Me.VisibleChanged If TimerClose.Enabled = True Then TimerClose.Stop() End If End Sub Private Sub MinimierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MinimierenToolStripMenuItem.Click Hide() End Sub Private Sub ClientÖffnenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ClientÖffnenToolStripMenuItem.Click OpenClose() End Sub Private Sub btnUserConfig_Click(sender As Object, e As EventArgs) Handles btnUserConfig.Click frmConfig_Basic.ShowDialog() End Sub Private Sub btnAdminConfig_Click(sender As Object, e As EventArgs) Handles btnAdminConfig.Click TimerClose.Stop() MONITORING_ACTIVE = False frmAdministration.ShowDialog() TimerClose.Start() MONITORING_ACTIVE = True End Sub Private Sub ClientBeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ClientBeendenToolStripMenuItem.Click Shut_Down End Sub Sub Shut_Down() If MsgBox("Wollen Sie das Programm beenden?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.Yes Then Close() End If End Sub Private Sub TimerRefresh_Tick(sender As Object, e As EventArgs) Handles TimerRefresh.Tick ClassInit.Refresh_Profile_Links() lblrefresh.Text = ClassInit.CheckModuleData() lblrefresh.Text = $"Refreshed: {Now.ToShortTimeString} - UserLoggedIn: {USERCOUNT_LOGGED_IN}" End Sub Private Sub BisherigenAblaufAnzeigenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BisherigenAblaufAnzeigenToolStripMenuItem.Click frmTreeView.ShowDialog() End Sub End Class