using System; using System.Data; using System.Windows.Forms; using System.Data.SQLite; using System.IO; using OfficeOpenXml; using System.Collections.Generic; using System.Threading; using System.Management; using System.Linq; namespace ПХД { public partial class Form1 : Form { private DatabaseManager dbManager; private bool isUnlocked = false; private string requiredKeyContent = "ключь доступа"; private Thread usbMonitorThread; private bool monitoringActive = true; public Form1() { InitializeComponent(); dbManager = new DatabaseManager(); SetupDataGridView(); // Запускаем мониторинг сразу StartUsbMonitoring(); // Проверяем ключ CheckForUsbKey(); } private void Form1_Load(object sender, EventArgs e) { // Проверяем ключ при загрузке формы if (!isUnlocked) { LockApplication("Вставьте USB-ключ для доступа к программе"); } else { dbManager.InitializeDatabase(); LoadEngines(); txtReason.Enabled = false; datePickerOutOfOrder.Enabled = false; } } private void LockApplication(string message) { // Создаем или используем существующую панель блокировки Panel lockPanel = Controls.Find("lockPanel", false).Length > 0 ? (Panel)Controls.Find("lockPanel", false)[0] : new Panel(); if (lockPanel.Name != "lockPanel") { lockPanel.Name = "lockPanel"; lockPanel.Dock = DockStyle.Fill; lockPanel.BackColor = System.Drawing.Color.FromArgb(240, 240, 240); Label lockMessage = new Label(); lockMessage.Name = "lockMessage"; lockMessage.Text = message; lockMessage.AutoSize = false; lockMessage.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; lockMessage.Dock = DockStyle.None; lockMessage.Size = new System.Drawing.Size(600, 80); // Увеличены размеры для размещения длинного текста lockMessage.Font = new System.Drawing.Font("Arial", 16, System.Drawing.FontStyle.Bold); // Размещаем по центру lockMessage.Location = new System.Drawing.Point( (this.ClientSize.Width - lockMessage.Width) / 2, (this.ClientSize.Height - lockMessage.Height) / 2 - 50); Button retryButton = new Button(); retryButton.Name = "retryButton"; retryButton.Text = "Проверить наличие ключа вручную"; retryButton.Size = new System.Drawing.Size(250, 40); retryButton.Location = new System.Drawing.Point( (this.ClientSize.Width - retryButton.Width) / 2, lockMessage.Bottom + 20); retryButton.Font = new System.Drawing.Font("Arial", 11, System.Drawing.FontStyle.Regular); retryButton.Click += (s, e) => { CheckForUsbKey(); // Если ключ найден, разблокируем приложение if (isUnlocked) { UnlockApplication(); // Инициализируем приложение dbManager.InitializeDatabase(); LoadEngines(); txtReason.Enabled = false; datePickerOutOfOrder.Enabled = false; } else { // Обновляем сообщение, если ключ не найден Label msg = lockPanel.Controls["lockMessage"] as Label; if (msg != null) { msg.Text = "Ключ не найден. Программа будет разблокирована автоматически при обнаружении ключа."; } } }; Label autoCheckLabel = new Label(); autoCheckLabel.Name = "autoCheckLabel"; autoCheckLabel.Text = "Программа автоматически проверяет наличие ключа..."; autoCheckLabel.AutoSize = false; autoCheckLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; autoCheckLabel.Size = new System.Drawing.Size(500, 30); // Увеличен размер autoCheckLabel.Font = new System.Drawing.Font("Arial", 9, System.Drawing.FontStyle.Italic); autoCheckLabel.Location = new System.Drawing.Point( (this.ClientSize.Width - autoCheckLabel.Width) / 2, retryButton.Bottom + 10); lockPanel.Controls.Add(lockMessage); lockPanel.Controls.Add(retryButton); lockPanel.Controls.Add(autoCheckLabel); // Добавляем панель блокировки на форму this.Controls.Add(lockPanel); lockPanel.BringToFront(); } else { // Если панель уже существует, обновляем сообщение и убеждаемся, что размер достаточен Label msg = lockPanel.Controls.OfType