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

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

Нужно программно нажать кнопку Enter определенным запущенным окнам.
т.е. необходимо найти окно по заголовку или по исполняемому файлу, эмулировать нажатие кнопки Enter и так с каждым окном. Как это сделать? =)
  • Вопрос задан
  • 770 просмотров
Пригласить эксперта
Ответы на вопрос 4
mshak
@mshak
Встроенной в шарп нет, но есть в Win32 api

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
Ответ написан
Комментировать
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;
        }
Ответ написан
Комментировать
Jump
@Jump Куратор тега Windows
Системный администратор со стажем.
Как найти окна по заголовку
FindWindowByTitle
Ответ написан
Комментировать
@pxaJJ
nircmd.exe
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы