Задать вопрос
@Qvazi
Web Developer: готов выслушать любое предложение.

Как найти окна по заголовку или исполняемому файлу?

Нужно программно нажать кнопку Enter определенным запущенным окнам.
т.е. необходимо найти окно по заголовку или по исполняемому файлу, эмулировать нажатие кнопки Enter и так с каждым окном. Как это сделать? =)
  • Вопрос задан
  • 799 просмотров
Подписаться 3 Простой Комментировать
Ответ пользователя # К ответам на вопрос (4)
mindtester
@mindtester Куратор тега Windows
http://iczin.su/hexagram_48
1 - найти окно, получить хендл (дубль ответа коллеги, тем не менее)
[DllImport("USER32.DLL", CharSet = CharSet.Auto)]
        internal static extern IntPtr FindWindow(string lpClassName, string lpWindowName);


2 - послать "энтрер"... а тут все может быть просто, или не совсем
просто SendKeys мне не подошел (долгая история, но можете с него и начать ))

3 - как вышло у меня, для типовых виндовых диалогов "открыть файл"/"сохранить файл" - надо "класс" приемник сообщения, и всю его иерархиею, начиная с хендла (диалога, в моем случае) (понадобится тула https://social.msdn.microsoft.com/Forums/vstudio/e... пример для сохранения

"Save Table".hWndByTitle().setTitle(csvDlg).waitForIdle().sendString(
                new string[] {
                    "DUIViewWndClassName",
                    "DirectUIHWND",
                    "FloatNotifySink",
                    "ComboBox",
                    "Edit" },
                csv);


реализация sendString

internal static IntPtr sendString(this IntPtr hWnd, string[] classNames, string msg, bool verb = false)
        {
            var hCtrl = hWnd;
            if (classNames != null && classNames.Count() > 0)
            {
                Thread.Sleep(to[toFileStdDlg]);
                foreach (var c in classNames)
                {
                    Thread.Sleep(to[toFileStdDlg]);
                    hCtrl = user32.FindWindowEx(hCtrl, IntPtr.Zero, c, null);
                    if (hCtrl.Equals(IntPtr.Zero))
                    {
                        $"\tERROR :: sendString not found class {c}".log();
                        return hWnd;
                    }
                    else
                        hCtrl.waitForIdle();
                }
            }
            for (int i = 0; i < msg.Length; i++)
                user32.PostMessage(hCtrl, WM_CHAR, msg[i], 0);

            Thread.Sleep(to[toFileStdDlg]);
            user32.PostMessage(hWnd, WM_KEYDOWN, user32.VkKeyScan('\r'), 0);
            user32.PostMessage(hWnd, WM_KEYUP, user32.VkKeyScan('\r'), 0);
            return hWnd;
        }
Ответ написан
Комментировать