Initial commit: OBS Launcher - автоматический запуск OBS при запуске GTA SA
This commit is contained in:
1 parent
a6036f6633
commit
c107452174
6 files changed
+301
No files matched your search
+71
@@ -0,0 +1,71 @@
|
||||
# Visual Studio files
|
||||
.vs/
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
*.userprefs
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio cache/options directory
|
||||
.vs/
|
||||
|
||||
# ReSharper
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
*.swp
|
||||
*.*~
|
||||
project.lock.json
|
||||
.DS_Store
|
||||
*.pyc
|
||||
nupkg/
|
||||
|
||||
# IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 kromskii2
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
+189
@@ -0,0 +1,189 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
using System.Security.Principal;
|
||||
using System.IO;
|
||||
using Microsoft.Win32;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace OBSLauncher
|
||||
{
|
||||
public class Program : Form
|
||||
{
|
||||
private NotifyIcon trayIcon;
|
||||
private ProcessMonitor processMonitor;
|
||||
private const string GTA_PROCESS_NAME = "gta_sa";
|
||||
private const string OBS_SHORTCUT_PATH = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\OBS Studio\OBS Studio (64bit).lnk";
|
||||
|
||||
[STAThread]
|
||||
public static void Main()
|
||||
{
|
||||
if (!IsAdministrator())
|
||||
{
|
||||
RestartAsAdmin();
|
||||
return;
|
||||
}
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new Program());
|
||||
}
|
||||
|
||||
private static bool IsAdministrator()
|
||||
{
|
||||
WindowsIdentity identity = WindowsIdentity.GetCurrent();
|
||||
WindowsPrincipal principal = new WindowsPrincipal(identity);
|
||||
return principal.IsInRole(WindowsBuiltInRole.Administrator);
|
||||
}
|
||||
|
||||
private static void RestartAsAdmin()
|
||||
{
|
||||
ProcessStartInfo proc = new ProcessStartInfo();
|
||||
proc.UseShellExecute = true;
|
||||
proc.WorkingDirectory = Environment.CurrentDirectory;
|
||||
proc.FileName = Application.ExecutablePath;
|
||||
proc.Verb = "runas";
|
||||
|
||||
try
|
||||
{
|
||||
Process.Start(proc);
|
||||
}
|
||||
catch
|
||||
{
|
||||
MessageBox.Show("Программа требует прав администратора для работы!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
public Program()
|
||||
{
|
||||
InitializeTrayIcon();
|
||||
AddToStartup();
|
||||
processMonitor = new ProcessMonitor(GTA_PROCESS_NAME, OBS_SHORTCUT_PATH);
|
||||
processMonitor.StartMonitoring();
|
||||
|
||||
// Настройка формы
|
||||
this.ShowInTaskbar = false;
|
||||
this.WindowState = FormWindowState.Minimized;
|
||||
}
|
||||
|
||||
private void InitializeTrayIcon()
|
||||
{
|
||||
trayIcon = new NotifyIcon();
|
||||
trayIcon.Icon = SystemIcons.Application;
|
||||
trayIcon.Text = "OBS Launcher";
|
||||
trayIcon.Visible = true;
|
||||
trayIcon.DoubleClick += TrayIcon_DoubleClick;
|
||||
|
||||
ContextMenuStrip contextMenu = new ContextMenuStrip();
|
||||
contextMenu.Items.Add("Показать", null, (s, e) => ShowForm());
|
||||
contextMenu.Items.Add("Закрыть", null, (s, e) => Application.Exit());
|
||||
trayIcon.ContextMenuStrip = contextMenu;
|
||||
}
|
||||
|
||||
private void TrayIcon_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
ShowForm();
|
||||
}
|
||||
|
||||
private void ShowForm()
|
||||
{
|
||||
this.Show();
|
||||
this.WindowState = FormWindowState.Normal;
|
||||
this.ShowInTaskbar = true;
|
||||
}
|
||||
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
base.OnResize(e);
|
||||
if (this.WindowState == FormWindowState.Minimized)
|
||||
{
|
||||
this.Hide();
|
||||
this.ShowInTaskbar = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void AddToStartup()
|
||||
{
|
||||
try
|
||||
{
|
||||
string appPath = Application.ExecutablePath;
|
||||
RegistryKey rk = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
|
||||
rk.SetValue("OBSLauncher", appPath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"Ошибка при добавлении в автозагрузку: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ProcessMonitor
|
||||
{
|
||||
private string targetProcessName;
|
||||
private string shortcutPath;
|
||||
private Timer checkTimer;
|
||||
private Timer delayTimer;
|
||||
private bool obsRunning = false;
|
||||
private bool gtaDetected = false;
|
||||
private const int DELAY_SECONDS = 50;
|
||||
|
||||
public ProcessMonitor(string targetProcessName, string shortcutPath)
|
||||
{
|
||||
this.targetProcessName = targetProcessName;
|
||||
this.shortcutPath = shortcutPath;
|
||||
checkTimer = new Timer();
|
||||
checkTimer.Interval = 1000; // Проверка каждую секунду
|
||||
checkTimer.Tick += CheckTimer_Tick;
|
||||
|
||||
delayTimer = new Timer();
|
||||
delayTimer.Interval = DELAY_SECONDS * 1000; // 50 секунд в миллисекундах
|
||||
delayTimer.Tick += DelayTimer_Tick;
|
||||
}
|
||||
|
||||
public void StartMonitoring()
|
||||
{
|
||||
checkTimer.Start();
|
||||
}
|
||||
|
||||
private void CheckTimer_Tick(object sender, EventArgs e)
|
||||
{
|
||||
bool gtaRunning = Process.GetProcessesByName(targetProcessName).Length > 0;
|
||||
|
||||
if (gtaRunning && !gtaDetected)
|
||||
{
|
||||
gtaDetected = true;
|
||||
delayTimer.Start();
|
||||
}
|
||||
else if (!gtaRunning && gtaDetected)
|
||||
{
|
||||
gtaDetected = false;
|
||||
delayTimer.Stop();
|
||||
obsRunning = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void DelayTimer_Tick(object sender, EventArgs e)
|
||||
{
|
||||
if (gtaDetected && !obsRunning)
|
||||
{
|
||||
try
|
||||
{
|
||||
Process.Start(new ProcessStartInfo
|
||||
{
|
||||
FileName = shortcutPath,
|
||||
UseShellExecute = true,
|
||||
WorkingDirectory = Path.GetDirectoryName(shortcutPath)
|
||||
});
|
||||
obsRunning = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show($"Ошибка при запуске OBS: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
delayTimer.Stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<assemblyIdentity version="1.0.0.0" name="OBSLauncher"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
Reference in new issue
Block a user