Использовать внешний Формуляр

У меня есть мое приложение в C#, я нуждаюсь в том, чтобы смочь наполнять три поля в другом приложении, использую этот код, чтобы поднимать другое приложение и посылать sendkeys

 [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string className, string windowTitle);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool ShowWindow(IntPtr hWnd, ShowWindowEnum flags);

        [DllImport("user32.dll")]
        private static extern int SetForegroundWindow(IntPtr hwnd);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowPlacement(IntPtr hWnd, ref Windowplacement lpwndpl);

        private enum ShowWindowEnum
        {
            Hide = 0,
            ShowNormal = 1, ShowMinimized = 2, ShowMaximized = 3,
            Maximize = 3, ShowNormalNoActivate = 4, Show = 5,
            Minimize = 6, ShowMinNoActivate = 7, ShowNoActivate = 8,
            Restore = 9, ShowDefault = 10, ForceMinimized = 11
        };

        private struct Windowplacement
        {
            public int length;
            public int flags;
            public int showCmd;
            public System.Drawing.Point ptMinPosition;
            public System.Drawing.Point ptMaxPosition;
            public System.Drawing.Rectangle rcNormalPosition;
        }

        public void TraerVentanaAlFrente(string proceso)
        {
            IntPtr wdwIntPtr = FindWindow(null, proceso);

            //Obtener el hWnd del proceso
            Windowplacement placement = new Windowplacement();
            GetWindowPlacement(wdwIntPtr, ref placement);

            // Verificar si la ventana esta minimizada
            if (placement.showCmd == 2)
            {
                //Si la ventana esta minimizada restaurarla
                ShowWindow(wdwIntPtr, ShowWindowEnum.Restore);
            }

            //Hacer foco en la ventana
            SetForegroundWindow(wdwIntPtr);
        }

Эта часть функционирует хорошо, с кодом смогите поднимать и делать focus в другом приложении, проблема состоит в том, что у другого приложения есть два отличных окна, и всегда он делает мне focus в окне 1 и мне нужно, чтобы он сформировался focus в окне 2

0
задан 12.01.2017, 23:28
2 ответа

Если это второе окно - "дочь" первой, ты можешь использовать FindWindowEx , чтобы искать используя первый указатель, который возвращает тебе FindWindow.

Другой mГ©todo, что может подавать тебя, - EnumWindows , которые он возвращает все окна.

1
ответ дан 24.11.2019, 12:28
  • 1
    Он был бы должен использовать это не? static extern Интптр Финдвиндовекс (IntPtr parentHWnd, IntPtr childAfterHWnd, string className, string windowTitle); Какие параметры я должен перемещать его? – Alejandro Ricotti 22.11.2016, 17:53
  • 2
    @AlejandroRicotti посмотри здесь объясняет все (на английском) pInvoke . Если ты это не получаешь, ты комментируешь мне, дело в том, что я сейчас не перед компьютером – Pikoh♦ 22.11.2016, 19:06
  • 3
    Это соединение, которое ты поместил, я это увидел, но не понял много, я думаю, что не то, в чем я нуждаюсь, то, в чем я нуждаюсь, состоит в том, чтобы меня принесло во главе окно, сын другого внешнего form в приложение. Я думаю, что этому может удаваться подать stackoverflow.com/questions/16710003/… , но я не уверен, как осуществление этого – Alejandro Ricotti 22.11.2016, 20:38
  • 4
    Tambié n я увидел, что pará метр появляется, который получает WindowsTitle и в действительности то, что идет, является выполнимым приложения, не именем титула, который он появляется – Alejandro Ricotti 22.11.2016, 21:48

ConseguГ - этот cГіdigo, что в отличие от использования FindWindow и FindWindowEx, которые работают из-за процесса, использует имя, что появляется в бруске заданий

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace EnumWindows { class Program { protected delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll")] private static extern int SetForegroundWindow(IntPtr hwnd); [DllImport("user32.dll", CharSet = CharSet.Unicode)] protected static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); [DllImport("user32.dll", CharSet = CharSet.Unicode)] protected static extern int GetWindowTextLength(IntPtr hWnd); [DllImport("user32.dll")] protected static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam); [DllImport("user32.dll")] protected static extern bool IsWindowVisible(IntPtr hWnd); protected static bool EnumTheWindows(IntPtr hWnd, IntPtr lParam) { int size = GetWindowTextLength(hWnd); if (size++ > 0 && IsWindowVisible(hWnd)) { StringBuilder sb = new StringBuilder(size); GetWindowText(hWnd, sb, size); Console.WriteLine(sb.ToString()); if (sb.ToString() == "NOMBRE DE CARPETA O APLICACION") { SetForegroundWindow(hWnd); } } return true; } static void Main(string[] args) { EnumWindows(new EnumWindowsProc(EnumTheWindows), IntPtr.Zero); Console.ReadKey(); } }

Это, что он делает, состоит в том, чтобы заносить в список все элементы панели инструментов, и делать focus в том, которого мы вводим в компьютер, мне остается приспосабливать это в классе, чтобы мочь осуществлять это в моем приложении forms

0
ответ дан 24.11.2019, 12:28