john1990_1 Ответов: 2

Как получить все дескрипторы всех процессов только недавно открытого окна chrome, а не целых окон chrome?


Привет друзья,

Я создаю exe - файл для запуска при нажатии пользовательской клавиши, которая при запуске создает новое окно Chrome с вкладкой веб-сайта Google Translate, я хочу вывести только это окно на передний план и установить фокус на его текстовое поле, чтобы пользователь начал печатать.

Я также мог бы вместо этого искать открытое окно Chrome с одним только Google Translate в нем, поэтому я не создаю новое окно, а вывожу только это окно, а не все окна Chrome на передний план и фокусируюсь на его текстовом поле.

Что я уже пробовал:

static List<Process> l;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            ProcessStartInfo prs = new ProcessStartInfo("chrome.exe");
            prs.Arguments = "http://translate.google.com" + " --new-window";
            prs.WindowStyle = ProcessWindowStyle.Normal;
            List<Process> processesBeforeNewChrome = Process.GetProcessesByName("chrome").ToList();
            Process.Start(prs);
            System.Threading.Thread.Sleep(100);
            List<Process> processesAfterLaunchingChrome = Process.GetProcessesByName("chrome").ToList();

            l = new List<Process>();
            for (int i = 0; i < processesAfterLaunchingChrome.Count; i++)
            {
                for (int k = 0; k < processesBeforeNewChrome.Count; k++)
                {
                    if (processesAfterLaunchingChrome[i].Id == processesBeforeNewChrome[k].Id)
                    {
                        goto skip;
                    }
                }
                l.Add(processesAfterLaunchingChrome[i]);
            skip:;
            }


            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_RESTORE);
            }


            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_MINIMIZE);
            }

            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_RESTORE);
                SetWindowPos(p.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
                BringWindowToTop(p.MainWindowHandle);
                SetForegroundWindow(p.MainWindowHandle);
            }

            foreach (Process p in l)
            {
                SetWindowPos(p.MainWindowHandle, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
                SetWindowPos(p.MainWindowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
            }

            foreach (Process p in l)
            {
                ShowWindow(p.MainWindowHandle, SW_RESTORE);
                BringWindowToTop(p.MainWindowHandle);
                SetFocus(new HandleRef(null, p.MainWindowHandle));
            }

            foreach (Process p in l)
            {
                SetForegroundWindow(p.MainWindowHandle);
            }

            gkh.HookedKeys.Add(Keys.Escape);
            gkh.KeyDown += Gkh_KeyDown;

            Application.Run();
        }

        private static void Gkh_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                foreach (Process p in l)
                {
                    try
                    {
                        ShowWindow(p.MainWindowHandle, SW_MINIMIZE);
                    }
                    catch { }
                }
                System.Diagnostics.Process.GetCurrentProcess().Kill();
            }
        }

        static globalKeyboardHook gkh = new globalKeyboardHook();

2 Ответов

Рейтинг:
1

OriginalGriff

И чем это отличается от вашего предыдущего вопроса: Как получить все ручки процесса?[^]

Читайте комментарии, читайте ответ. Вещи не меняются, потому что вам не нравится то, что вам говорят...


john1990_1

Ну, это другое дело, должен ли я сдаться?

Я не думаю, что использование http-запроса для получения перевода текстового поля WinForm удобно и удобно для пользователя, веб-страница Google Translate гораздо более реактивна и интерактивна, и легче выбирать языки с предложением, историей и всем прочим!

Dave Kreskowiak

Таким образом, вместо написания кода для обеспечения эквивалентного интерфейса в вашем приложении, предоставления тех же параметров и использования API translate для выполнения этой работы, вы собираетесь написать приложение WinForms вокруг страницы Google Translate. Зачем кому-то использовать ваше приложение, если он может просто открыть браузер, который работает, и выполнить работу так же быстро?

Вы сказали, что Google Translate не работает с элементом управления WebBrowser из панели инструментов? Это потому, что этот элемент управления-всего лишь оболочка для Internet Explorer. По умолчанию он использует рендеринг IE7, который Google Translate больше не поддерживает. Вы можете изменить это, и страница снова будет работать, но это не решит вашу проблему, когда вы не можете контролировать этот интерфейс и то, как пользователь взаимодействует с ним.

john1990_1

Потрясающе, как я могу изменить рендеринг от IE7?

Dave Kreskowiak

https://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version

Вы должны использовать версию взлома реестра, так как вы не можете изменить страницу, поступающую из Google.

john1990_1

Будет ли это стабильным решением? Я попробовал встраивать Хром, но он не был устойчив в самом рисовании.

Dave Kreskowiak

Что вы подразумеваете под "стабильным"? Этот вариант существует и используется уже по крайней мере 10 лет, насколько мне известно.

john1990_1

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

Dave Kreskowiak

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

Да, каждый клиент, на котором вы запускаете свой код, должен иметь это значение реестра. Обычно это делается в установщике приложения, а не в самом приложении.

john1990_1

Мне просто нужны идентификаторы процессов и их дескрипторы недавно открытого окна Chrome (а не целых окон Chrome), почему это так сложно?

Dave Kreskowiak

Бвахахахахахахахааа!!!!! Ты понятия не имеешь, о чем говоришь.

john1990_1

Почему это так?

Dave Kreskowiak

Потому что нигде нет свойства, которое говорит: "Вот список дескрипторов, которые есть у этого prcess". Вы должны перепрыгнуть через обручи Win32, чтобы получить список дескрипторов в масштабах всей системы.

Делает "этот[^]" похоже на то, что вы хотите попробовать воспроизвести в управляемом коде? Вы жаловались, как "сложно" установить значение реестра, и это действительно просто сделать.

OriginalGriff

Дейв прав - то, что вы задаете этот вопрос, показывает, как мало вы знаете о том, как работает Windows, и это означает, что эта задача, вероятно, намного превосходит ваш текущий набор навыков. (Особенно если вы думаете, что установка записей реестра-это сложно!)

Я бы настоятельно посоветовал вам отложить это до тех пор, пока вы не узнаете больше - вы настраиваете себя на мир боли и разочарования.

john1990_1

Ну я знаю, как изменить реестр на моем ПК не в установке приложения (которое даже не во время выполнения), я абсолютно не знаю, как изменить установку приложения, я не хочу углубляться в компьютеры, поэтому я буду использовать свой браузер Comodo Dragon только для страницы Google Translate, он работает нормально, просто текстовое поле страницы Google Translate в браузере Comodo Dragon не выбирается всегда (только после того, как он долго не запускает exe-файл, он работает хорошо). Есть какая-нибудь информация о том, как сделать так, чтобы он был выбран? Я знаю, как вызвать поддельный щелчок мыши, должен ли я это сделать?

Рейтинг:
1

RickZeeland

Подобный вопрос был задан давно, может быть, вы найдете в нем что-то полезное: Открываются ссылки из хрома в C# форм приложение[^]


john1990_1

Ну, я сделал прекрасную программу, которая выводит на передний план браузер Comodo Dragon со страницей Google Translate в нем, вы можете увидеть мой код в конце моей страницы:
https://sites.google.com/site/workofmylife1234/
Я больше не хочу тратить много времени на Программирование!