强化自动点击登录 (#1853)

This commit is contained in:
zdAnQi
2025-07-09 23:20:13 +08:00
committed by GitHub
parent e23180327d
commit 07c3a912c5
3 changed files with 132 additions and 24 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,4 +1,4 @@
using BetterGenshinImpact.Core.Recognition;
using BetterGenshinImpact.Core.Recognition;
using BetterGenshinImpact.GameTask.Model;
using OpenCvSharp;
@@ -6,11 +6,21 @@ namespace BetterGenshinImpact.GameTask.GameLoading.Assets;
public class GameLoadingAssets : BaseAssets<GameLoadingAssets>
{
public RecognitionObject ChooseEnterGameRo;
public RecognitionObject EnterGameRo;
public RecognitionObject WelkinMoonRo;
private GameLoadingAssets()
{
ChooseEnterGameRo = new RecognitionObject
{
Name = "ChooseEnterGame",
RecognitionType = RecognitionTypes.TemplateMatch,
TemplateImageMat = GameTaskManager.LoadAssetImage("GameLoading", "choose_enter_game.png"),
RegionOfInterest = new Rect(0, CaptureRect.Height / 2, CaptureRect.Width, CaptureRect.Height - CaptureRect.Height / 2),
DrawOnWindow = false
}.InitTemplate();
EnterGameRo = new RecognitionObject
{
Name = "EnterGame",

View File

@@ -1,4 +1,4 @@
using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.GameTask.GameLoading.Assets;
using System;
using System.Diagnostics;
@@ -13,8 +13,13 @@ using System.Text.RegularExpressions;
using System.Threading.Channels;
using Microsoft.Win32;
using System.Windows.Documents;
using System.Linq;
using System.Threading;
using System.Runtime.InteropServices;
using System.Text;
using BetterGenshinImpact.Core.Recognition.OpenCv;
using BetterGenshinImpact.Helpers.Extensions;
using Vanara.PInvoke;
namespace BetterGenshinImpact.GameTask.GameLoading;
@@ -49,6 +54,8 @@ public class GameLoadingTrigger : ITaskTrigger
private string FileName = "";
private bool biliLoginClicked = false;
public GameLoadingTrigger()
{
GameLoadingAssets.DestroyInstance();
@@ -57,8 +64,6 @@ public class GameLoadingTrigger : ITaskTrigger
public void Init()
{
IsEnabled = _config.AutoEnterGameEnabled;
// // 前面没有联动启动原神,这个任务也不用启动
@@ -68,9 +73,6 @@ public class GameLoadingTrigger : ITaskTrigger
// }
if (_config.RecordGameTimeEnabled)
{
FileName = Path.GetFileName(_config.InstallPath);
if (FileName == "GenshinImpact.exe") {
GameServer = "hk4e_global";
@@ -78,7 +80,6 @@ public class GameLoadingTrigger : ITaskTrigger
}
if (FileName == "YuanShen.exe")
{
string iniPath = Path.GetDirectoryName(_config.InstallPath) + "//config.ini";
string iniContent;
string pattern = @"
@@ -98,11 +99,6 @@ public class GameLoadingTrigger : ITaskTrigger
{
}
// channelValue = 1 官服
// channelValue = 14 B服
if (channelValue == "1")
@@ -117,7 +113,6 @@ public class GameLoadingTrigger : ITaskTrigger
}
Debug.WriteLine($"[GameLoading] 从文件读取到游戏区服:{GameServer}");
// 这里注册表的优先级要比读取文件低因为使用starward安装原神不会写入注册表
if (GameServer == null)
@@ -126,9 +121,10 @@ public class GameLoadingTrigger : ITaskTrigger
Debug.WriteLine($"[GameLoading] 从注册表读取到游戏区服:{GameServer}");
StartStarward();
}
}
} }
}
}
public bool StartStarward()
{
try
@@ -147,12 +143,11 @@ public class GameLoadingTrigger : ITaskTrigger
}
catch (Exception ex)
{
Debug.WriteLine("[GameLoading] Starward记录时间失败");
return false;
}
}
public string GetGameServerRegistry()
{
try
@@ -188,6 +183,7 @@ public class GameLoadingTrigger : ITaskTrigger
}
return "";
}
public bool IsStarwardProtocolRegistered()
{
try
@@ -216,6 +212,7 @@ public class GameLoadingTrigger : ITaskTrigger
// 如果键不存在或不符合条件,返回 false
return false;
}
public void OnCapture(CaptureContent content)
{
// 2s 一次
@@ -237,12 +234,81 @@ public class GameLoadingTrigger : ITaskTrigger
return;
}
// B服判断逻辑
bool isBili = false;
try
{
var exePath = _config.InstallPath;
if (!string.IsNullOrEmpty(exePath))
{
var configIni = Path.Combine(Path.GetDirectoryName(exePath)!, "config.ini");
if (File.Exists(configIni))
{
var lines = File.ReadAllLines(configIni);
foreach (var line in lines)
{
var kv = line.Trim();
if (kv.StartsWith("channel=") && kv.EndsWith("14"))
{
isBili = true;
break;
}
}
}
}
}
catch (Exception ex)
{
TaskControl.Logger.LogWarning("B服判断异常: " + ex.Message);
}
// 官服流程:先识别并点击顶号或切号的后一次“进入游戏”弹窗按钮
if (!isBili)
{
var extraEnterGameBtn = content.CaptureRectArea.Find(_assets.ChooseEnterGameRo);
if (!extraEnterGameBtn.IsEmpty())
{
extraEnterGameBtn.Click();
return;
}
}
using var ra = content.CaptureRectArea.Find(_assets.EnterGameRo);
if (!ra.IsEmpty())
{
// 随便找个相对点击的位置
TaskContext.Instance().PostMessageSimulator.LeftButtonClickBackground();
// TaskControl.Logger.LogInformation("自动开门");
if (isBili)
{
if (!biliLoginClicked)
{
int failCount = 0;
while (true)
{
var process = Process.GetProcessesByName("YuanShen").FirstOrDefault();
if (process != null && GetBiliLoginWindow(process) != IntPtr.Zero)
{
GameCaptureRegion.GameRegion1080PPosClick(960, 630);
TaskControl.Sleep(3000, CancellationToken.None);
if (GetBiliLoginWindow(process) != IntPtr.Zero)
{
GameCaptureRegion.GameRegion1080PPosClick(960, 630);
}
biliLoginClicked = true;
break;
}
failCount++;
if (failCount > 20)
{
break;
}
TaskControl.Sleep(500, CancellationToken.None);
}
}
// B服登录点击后等待一小段时间再执行官服点击逻辑
TaskControl.Sleep(5000, CancellationToken.None);
ClickEnterGameButton();
}
else
{
ClickEnterGameButton();
}
return;
}
@@ -265,4 +331,36 @@ public class GameLoadingTrigger : ITaskTrigger
return;
}
}
};
// B服登录窗口检测(参考Login3rdParty)
private static IntPtr GetBiliLoginWindow(Process process)
{
IntPtr bHWnd = IntPtr.Zero;
User32.EnumWindows((hWnd, lParam) =>
{
try
{
User32.GetWindowThreadProcessId(hWnd, out uint pid);
if (pid == process.Id)
{
int capacity = User32.GetWindowTextLength(hWnd);
StringBuilder title = new(capacity + 1);
User32.GetWindowText(hWnd, title, title.Capacity);
if (title.ToString().Contains("bilibili", StringComparison.OrdinalIgnoreCase))
{
bHWnd = hWnd.DangerousGetHandle();
return false;
}
}
}
catch { }
return true;
}, IntPtr.Zero);
return bHWnd;
}
private void ClickEnterGameButton()
{
TaskContext.Instance().PostMessageSimulator.LeftButtonClickBackground();
}
};