123 lines
4.4 KiB
Plaintext
123 lines
4.4 KiB
Plaintext
using Custom.CuCustomWndAPI;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Newtonsoft.Json;
|
|
using SafeBagDE70.Admin;
|
|
using SafeBagDE70.Model;
|
|
using SafeBagDE70.StateMachine;
|
|
using Serilog;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Configuration;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Forms;
|
|
using VirtualKeyboard.Wpf;
|
|
|
|
namespace SafeBagDE70
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for App.xaml
|
|
/// </summary>
|
|
public partial class App : System.Windows.Application
|
|
{
|
|
public static StateMachineConfig StateMachineConfig { get; private set; }
|
|
private static Mutex mutex;
|
|
public App()
|
|
{
|
|
}
|
|
protected override void OnStartup(StartupEventArgs e)
|
|
{
|
|
base.OnStartup(e);
|
|
|
|
CheckInstance();
|
|
LoadConfig();
|
|
LoadDualScreens();
|
|
}
|
|
private static void CheckInstance()
|
|
{
|
|
bool isNewInstance;
|
|
string mutexName = "9f5b55c9-c6eb-443a-8e28-027defa46fb5";
|
|
|
|
mutex = new Mutex(true, mutexName, out isNewInstance);
|
|
|
|
if (!isNewInstance)
|
|
{
|
|
// If an instance is already running, exit the application
|
|
System.Windows.MessageBox.Show("Ứng dụng đã khởi chạy");
|
|
System.Windows.Application.Current.Shutdown();
|
|
return;
|
|
}
|
|
}
|
|
private static void LoadConfig()
|
|
{
|
|
try
|
|
{
|
|
AppData.CurrentVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
|
VKeyboard.Listen<System.Windows.Controls.TextBox>(e => e.Text);
|
|
var configuration = new ConfigurationBuilder()
|
|
.AddJsonFile("appsettings.json")
|
|
.Build();
|
|
Log.Logger = new LoggerConfiguration()
|
|
.ReadFrom.Configuration(configuration)
|
|
.WriteTo.Sink(new RealTimeLogSink(AppData.logCollection))
|
|
.CreateLogger();
|
|
AppData.CDMPort = configuration["SerialPort:CDMPort"];
|
|
AppData.SensorPort = configuration["SerialPort:SensorPort"];
|
|
StateMachineConfig = new StateMachineConfig();
|
|
configuration.GetSection("StateMachine").Bind(StateMachineConfig);
|
|
Log.Information("START APP");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
System.Windows.MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
private void LoadDualScreens()
|
|
{
|
|
// Create instances of the windows you want to open
|
|
var mainWindow = new MainWindow();
|
|
|
|
// Show both windows
|
|
mainWindow.Show();
|
|
|
|
// Get all available screens
|
|
var screens = Screen.AllScreens;
|
|
|
|
// Open the Main Window on the primary screen
|
|
var primaryScreen = screens.FirstOrDefault(s => s.Primary) ?? screens.First();
|
|
PositionWindowOnScreen(mainWindow, primaryScreen);
|
|
mainWindow.Show();
|
|
|
|
// Open the Secondary Window on the secondary screen, if available
|
|
if (screens.Length > 1)
|
|
{
|
|
var adminWindow = new AdminWindow(); // Replace this with your actual window class
|
|
adminWindow.Show();
|
|
var secondaryScreen = screens.First(s => !s.Primary);
|
|
PositionWindowOnScreen(adminWindow, secondaryScreen);
|
|
adminWindow.Show();
|
|
}
|
|
}
|
|
|
|
private void PositionWindowOnScreen(Window window, Screen screen)
|
|
{
|
|
// Convert screen bounds to WPF units (96 DPI)
|
|
var screenLeft = screen.WorkingArea.Left / (double)Screen.PrimaryScreen.WorkingArea.Width * SystemParameters.PrimaryScreenWidth;
|
|
var screenTop = screen.WorkingArea.Top / (double)Screen.PrimaryScreen.WorkingArea.Height * SystemParameters.PrimaryScreenHeight;
|
|
|
|
// Set window position and state
|
|
window.WindowStartupLocation = WindowStartupLocation.Manual;
|
|
window.Left = screenLeft;
|
|
window.Top = screenTop;
|
|
window.Width = screen.WorkingArea.Width;
|
|
window.Height = screen.WorkingArea.Height;
|
|
}
|
|
}
|
|
}
|