public static async Task SendMessage(string ipcName, int ipcId, string command) { var wh = new WindowHandleInfo(IntPtr.Zero); var targetWindowHandles = wh.GetAllChildHandles() .Select( childWindow => { try { var prop = User32.GetProp(childWindow, ipcName).ToInt32(); if (prop == ipcId) { return(childWindow); } } catch (Exception) { // ignored } return(IntPtr.Zero); }) .Where(x => x != IntPtr.Zero) .Distinct() .ToList(); var cds = new User32.COPYDATASTRUCT { dwData = new IntPtr(ipcId), cbData = command.Length, lpData = command }; if (targetWindowHandles.Count > 0) { await Task.WhenAll( targetWindowHandles.Select( target => Task.Run( () => { User32.SendMessage(target, User32.WM_COPYDATA, IntPtr.Zero, ref cds); var lastError = Marshal.GetLastWin32Error(); if (lastError != 0) { using (var eventLog = new EventLog("Application")) { // TODO: "Application" / "Application Error" can be used without admin privileges, if we want our own source, it needs to be registered under Admin rights. eventLog.Source = "Application Error"; eventLog.WriteEntry("WIN32 error while sending message from Ridder.PhoneHelper.App.exe: " + lastError, EventLogEntryType.Error, lastError, 0); } } }))); } }
private void Win_Click(object sender, RoutedEventArgs e) { //Process[] p = Process.GetProcesses(); //Process fs = null; //foreach(var pr in p) //{ // Console.WriteLine(pr.ProcessName); // if(pr.ProcessName == "FlightSimulator") // { // Console.WriteLine(pr.Handle.ToString("X")); // IntPtr child2 = Helpers.FindWindowEx2(pr.Handle, IntPtr.Zero, "AceApp", "$AS1000_PFD_1"); // } //} // return; IntPtr parent = IntPtr.Zero; foreach (var p in Process.GetProcesses()) { if (p.ProcessName.Contains("Simu")) { Console.WriteLine(p.ProcessName); parent = p.Handle; } } //IntPtr parent = Helpers.FindWindowA("Microsoft Flight Simulator - 1.16.2.0"); //IntPtr parent = Helpers.FindWindowA("Microsoft Flight Simulator"); //Console.WriteLine(parent.ToString("X")); WindowHandleInfo hi = new WindowHandleInfo(parent); var list = hi.GetAllChildHandles(); foreach (var w in list) { Console.WriteLine($"{w.ToString()}, {w.ToString("X")}"); Rect size = hi.GetPos(w); //{ 319,479,1024,1024} //hi.SetPos(w, 0, 0, 600, 400); if (size.Left == 319 && size.Width == 1024) { //hi.SetPos((IntPtr)w, 400, 400, 800, 800); } } }