diff --git a/.idea/.idea.TelepadGuru/.idea/.gitignore b/.idea/.idea.TelepadGuru/.idea/.gitignore new file mode 100644 index 0000000..34c870c --- /dev/null +++ b/.idea/.idea.TelepadGuru/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/projectSettingsUpdater.xml +/modules.xml +/contentModel.xml +/.idea.TelepadGuru.iml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.TelepadGuru/.idea/indexLayout.xml b/.idea/.idea.TelepadGuru/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.TelepadGuru/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.TelepadGuru/.idea/vcs.xml b/.idea/.idea.TelepadGuru/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.TelepadGuru/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Form1.cs b/Form1.cs index 2867518..cf4b1e2 100644 --- a/Form1.cs +++ b/Form1.cs @@ -1,21 +1,16 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; using System.Linq; -using System.Text; using System.Threading; -using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; +using System.Globalization; using System.Runtime.InteropServices; using System.Net; -using System.Net.NetworkInformation; using System.Text.RegularExpressions; using System.IO; +using System.Net.Http; using MTorrent; -using Accessibility; namespace TelepadGuru { @@ -27,47 +22,23 @@ public Form1() { InitializeComponent(); List powers = new List() {5, 10, 20, 25, 30, 40, 50, 80, 100}; - setPow.DataSource = powers;; + setPow.DataSource = powers; setPow.SelectedIndex = 6; - refreshProcess(); - refreshCoords(); + RefreshProcess(); + RefreshCoords(); } - + [DllImport("user32.dll")] - static extern bool SetForegroundWindow(IntPtr hWnd); - - [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - public static extern IntPtr GetForegroundWindow(); - - delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); - - [DllImport("user32.dll")] - static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, - IntPtr lParam); - - [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] - static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, - int nMaxCount); + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetForegroundWindow(IntPtr hWnd); - [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] - static extern int GetWindowTextLength(IntPtr hWnd); - static IEnumerable EnumerateProcessWindowHandles(int processId) - { - var handles = new List(); - - foreach (ProcessThread thread in Process.GetProcessById(processId).Threads) - EnumThreadWindows(thread.Id, - (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero); - - return handles; - } - private void refreshProcessList_Click(object sender, EventArgs e) + private void refreshProcessList_Click(object sender, EventArgs e) { - refreshProcess(); + RefreshProcess(); } - private void refreshProcess() + private void RefreshProcess() { List dreamseekers = new List(Process.GetProcessesByName("dreamseeker")); processList.DataSource = dreamseekers; @@ -109,7 +80,7 @@ private void button1_Click(object sender, EventArgs e) double num5 = this.CalcBearing(num, num2); double num6 = this.CalcBearing(num3, num4); double num7 = 30.0; - double num8 = 90.0 - this.roundBearing(num5, num6); + double num8 = 90.0 - this.RoundBearing(num5, num6); num5 = 90.0 - num5; num6 = 90.0 - num6; bool flag = false; @@ -187,9 +158,9 @@ private void button1_Click(object sender, EventArgs e) double num15 = num14; if (dictionary2[num13].Contains(num15 + num9)) { - this.offPower.Text = (num13 - num7).ToString(); - this.offBearing.Text = (num8).ToString(); - this.offElevation.Text = (num15 - 45.0).ToString(); + this.offPower.Text = (num13 - num7).ToString(CultureInfo.InvariantCulture); + this.offBearing.Text = (num8).ToString(CultureInfo.InvariantCulture); + this.offElevation.Text = (num15 - 45.0).ToString(CultureInfo.InvariantCulture); flag = true; } } @@ -208,7 +179,7 @@ public double CalcBearing(double x, double y) return 180.0 * Math.Atan2(y, x) / 3.141592653589793; } - public double roundBearing(double x, double y) + public double RoundBearing(double x, double y) { double result; if (Math.Floor(x) == Math.Ceiling(y)) @@ -262,16 +233,16 @@ private void button4_Click(object sender, EventArgs e) { double num = Convert.ToDouble(this.rxb.Text) - Convert.ToDouble(this.ix.Text); double num2 = Convert.ToDouble(this.ryb.Text) - Convert.ToDouble(this.iy.Text); - this.dxBox.Text = num.ToString(); - this.dyBox.Text = num2.ToString(); + this.dxBox.Text = num.ToString(CultureInfo.InvariantCulture); + this.dyBox.Text = num2.ToString(CultureInfo.InvariantCulture); } private void button5_Click(object sender, EventArgs e) { double num = Convert.ToDouble(this.rxb.Text) - Convert.ToDouble(this.ix.Text); double num2 = Convert.ToDouble(this.ryb.Text) - Convert.ToDouble(this.iy.Text); - this.d2xBox.Text = num.ToString(); - this.d2yBox.Text = num2.ToString(); + this.d2xBox.Text = num.ToString(CultureInfo.InvariantCulture); + this.d2yBox.Text = num2.ToString(CultureInfo.InvariantCulture); } private void button2_Click(object sender, EventArgs e) @@ -291,7 +262,7 @@ private void Calkulate() { num5 += 360.0; } - this.setBear.Text = Math.Round(num5 - Convert.ToDouble(this.offBearing.Text), 2).ToString().Replace(",", "."); + this.setBear.Text = Math.Round(num5 - Convert.ToDouble(this.offBearing.Text), 2).ToString(CultureInfo.InvariantCulture).Replace(",", "."); this.lab.Text = ""; double num6; double num7; @@ -323,83 +294,66 @@ private void Calkulate() double num11 = num10; num6 += num11; } - this.setElev.Text = (Math.Round(num6 / (double)list.Count, 1) - Convert.ToDouble(this.offElevation.Text)).ToString().Replace(",", "."); + this.setElev.Text = (Math.Round(num6 / (double)list.Count, 1) - Convert.ToDouble(this.offElevation.Text)).ToString(CultureInfo.InvariantCulture).Replace(",", "."); this.lab.Text = "Вычислено"; return; } this.lab.Text = "Недостаточная мощность"; } - private IntPtr FindWindow(string name) - { - - foreach (IntPtr wind in EnumerateProcessWindowHandles(Process.GetProcessesByName("dreamseeker")[0].Id)) + private void TurnCommand(string command, string data = "") + { + try { - int textLength = GetWindowTextLength(wind); - StringBuilder outText = new StringBuilder(textLength + 1); - int a = GetWindowText(wind, outText, outText.Capacity); - if (outText.ToString() == name) - return wind; - } - - return IntPtr.Zero; - } + Process process = processList.SelectedValue as Process; - // -2 54 - // -2 64 - // 100 100 2 - private IntPtr GetLastWindow() - { - return EnumerateProcessWindowHandles(Process.GetProcessesByName("dreamseeker")[0].Id).First(); + if (process == null) + { + return; + } + + WindowUtility windowUtility = new WindowUtility(process); + SetForegroundWindow(process.MainWindowHandle); - } - private IEnumerable GetAllWindows() - { - return EnumerateProcessWindowHandles(Process.GetProcessesByName("dreamseeker")[0].Id); - } + //WebRequest.Create(command); + HttpClient reqGet = new HttpClient(new HttpClientHandler()); + HttpResponseMessage request = reqGet.Send(new HttpRequestMessage(HttpMethod.Get, command)); + + if (!request.IsSuccessStatusCode) + { + return; + } + + Thread.Sleep(150); - private bool TurnCommand(string command, string data = "", string searchWindow = "") - { - IEnumerable before_windows = GetAllWindows(); - IntPtr targetWindow = IntPtr.Zero; - WebRequest reqGET = WebRequest.Create(command); - WebResponse resp = reqGET.GetResponse(); - Thread.Sleep(150); - IEnumerable after_windows = GetAllWindows(); - foreach(IntPtr window in after_windows) - { - if (before_windows.Contains(window)) - continue; - targetWindow = window; - } - try - { + IntPtr targetWindow = windowUtility.GetNewestWindowHandle(); //targetWindow = GetLastWindow(); SetForegroundWindow(targetWindow); SendKeys.Send(data); Thread.Sleep(100); - return true; } catch { + // ignored } - return false; - } + } - private string GetAdress() + private string GetAddress() { Process mainProcess = processList.SelectedValue as Process; - List connections = NetworkInformation.GetProcessTcpActivity(mainProcess.Id); - connections[0].LocalEndPoint.Port.ToString(); + if (mainProcess == null) + { + return ""; + } DirectoryInfo dir = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/BYOND/cache/tmp" + mainProcess.Id.ToString()); List fileList = new List(); string searchText = "Recalibrate Crystals"; - string file_name = ""; - string consoleID = ""; + string fileName = ""; + string consoleId = ""; foreach (var file in (from file in dir.GetFiles("*.htm", SearchOption.AllDirectories) orderby file.LastAccessTime descending select file).ToArray()) { @@ -411,42 +365,41 @@ private string GetAdress() string tmp = File.ReadAllText(file); if (tmp.Contains(searchText)) { - int index1 = tmp.IndexOf("?src=[0x"); - consoleID = tmp.Substring(index1 + 6, 9); - file_name = file.Split('\\').Last(); + int index1 = tmp.IndexOf("?src=[0x", StringComparison.Ordinal); + consoleId = tmp.Substring(index1 + 6, 9); + fileName = file.Split('\\').Last(); break; } } - if (consoleID == "") + if (consoleId == "") return ""; string port = comboBox1.SelectedValue.ToString(); - if (port == "") + if (string.IsNullOrWhiteSpace(port)) return ""; - return "http://127.0.0.1:" + port + "/tmp" + mainProcess.Id.ToString() + "/" + file_name + "?src=[" + consoleID + "];"; + return "http://127.0.0.1:" + port + "/tmp" + mainProcess.Id.ToString() + "/" + fileName + "?src=[" + consoleId + "];"; } - - private string searchWindow = "Telepad Control Console"; + private void OpenWormhole() { Calkulate(); - string adress = GetAdress(); + string address = GetAddress(); - if (adress == "") + if (address == "") return; - TurnCommand(adress + "setrotation=1", setBear.Text + "{ENTER}", searchWindow); + TurnCommand(address + "setrotation=1", setBear.Text + "{ENTER}"); - TurnCommand(adress + "setangle=1", setElev.Text + "{ENTER}", searchWindow); + TurnCommand(address + "setangle=1", setElev.Text + "{ENTER}"); - TurnCommand(adress + "setpower=" + (setPow.SelectedIndex + 1)); + TurnCommand(address + "setpower=" + (setPow.SelectedIndex + 1)); if (checkBox1.Checked) { - TurnCommand(adress + "close_teleport=1"); - TurnCommand(adress + "open_teleport=1"); + TurnCommand(address + "close_teleport=1"); + TurnCommand(address + "open_teleport=1"); } } @@ -461,7 +414,7 @@ private void OpenWormholeFromMap(object sender, EventArgs e) { return; } - string line = ""; + string line; if ((line = reader.ReadLine()) == null) { reader.Close(); @@ -478,8 +431,12 @@ private void OpenWormholeFromMap(object sender, EventArgs e) string[] coords = line.Split(' '); rxb.Text = coords[0]; ryb.Text = coords[1]; + + string adress = GetAddress(); + if (adress == "") + return; - TurnCommand(GetAdress() + "setz=1", coords[2] + "{ENTER}"); + TurnCommand(adress + "setz=1", coords[2] + "{ENTER}"); OpenWormhole(); } @@ -488,12 +445,11 @@ private void button3_Click(object sender, EventArgs e) OpenWormhole(); } - private void refreshCoords() + private void RefreshCoords() { List coordsList = new List(); StreamReader reader = new StreamReader("coordinates.txt"); - string line = ""; - while ((line = reader.ReadLine()) != null) + while (reader.ReadLine() is { } line) { string res = ParseCoordsPaper(line); if(res != "") @@ -519,23 +475,84 @@ private string ParseCoordsPaper(string line) private void button6_Click(object sender, EventArgs e) { - refreshCoords(); + RefreshCoords(); } private void button7_Click(object sender, EventArgs e) { - string adress = GetAdress(); + string adress = GetAddress(); if (adress == "") return; string value = comboBox2.SelectedValue as string; - List coords = value.Split(' ').ToList(); + List coords = value?.Split(' ').ToList() ?? new List(); if (coords.Count < 3) return; rxb.Text = coords[0]; ryb.Text = coords[1]; if (coords[2] != "unknown") - TurnCommand(adress + "setz=1", coords[2] + "{ENTER}", searchWindow); + TurnCommand(adress + "setz=1", coords[2] + "{ENTER}"); OpenWormhole(); } } + + public class WindowUtility + { + public IntPtr NewestWindowHandle = IntPtr.Zero; + public DateTime NewestWindowTime = DateTime.MinValue; + + public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder lpString, int nMaxCount); + + [DllImport("user32.dll")] + public static extern int GetWindowTextLength(IntPtr hWnd); + + [DllImport("user32.dll")] + public static extern bool IsWindowVisible(IntPtr hWnd); + + public WindowUtility(Process process) + { + EnumWindows(EnumWindowsCallback, process.Handle); + } + + public IntPtr GetNewestWindowHandle() + { + return NewestWindowHandle; + } + + private bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam) + { + if (IsWindowVisible(hWnd)) + { + int windowProcessId; + GetWindowThreadProcessId(hWnd, out windowProcessId); + + if (windowProcessId == (int)lParam) + { + DateTime windowCreationTime = GetWindowCreationTime(hWnd); + if (windowCreationTime > NewestWindowTime) + { + NewestWindowTime = windowCreationTime; + NewestWindowHandle = hWnd; + } + } + } + return true; + } + + private DateTime GetWindowCreationTime(IntPtr hWnd) + { + int pid; + GetWindowThreadProcessId(hWnd, out pid); + Process process = Process.GetProcessById(pid); + return process.StartTime; + } + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); + } } diff --git a/TelepadGuru.csproj b/TelepadGuru.csproj index af73942..b4988b0 100644 --- a/TelepadGuru.csproj +++ b/TelepadGuru.csproj @@ -2,7 +2,7 @@ WinExe - net5.0-windows + net7.0-windows true