С# не удается найти кнопку приложения Java

Я пытаюсь отправить нажатие кнопки другому приложению, в данном случае это приложение Java. Я использую FindWindow(). Я могу использовать SendKeys.SendWait() для отправки ключей в окно приложения, однако, когда я пытаюсь нажать кнопку «Регистрация», Findwindowex() возвращает 0 для указателя кнопки. Моя единственная мысль заключается в том, что, возможно, FindWindowEx() не любит, чтобы родительский и дочерний дескрипторы были одинаковыми, но в этом случае нет дескриптора дочернего окна. Любая помощь будет принята с благодарностью.

    [DllImport("user32.dll")]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

    [DllImport("user32.dll", CharSet=CharSet.Auto)]

    public static extern int SendMessage(int hWnd, int msg, int wParam, IntPtr lParam);
    public void Start()
    {
        IntPtr zero = IntPtr.Zero;
        for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++)
        {
            Thread.Sleep(500);
            zero = FindWindow(null, "EDM Autosync Client Login");
        }
        if (zero != IntPtr.Zero)
        {
            SetForegroundWindow(zero);
            SendKeys.SendWait("username");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("password");
            SendKeys.SendWait("{ENTER}");
            SendKeys.Flush();
        }
    }

    public void register()
    {
        IntPtr zero = IntPtr.Zero;
        IntPtr hwndChild = IntPtr.Zero;
        int BN_CLICKED = 245;
        int WM_CLOSE = 16;

        for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++)
        {
            Thread.Sleep(500);
            zero = FindWindow(null, "Autosync Connection Registration");
        }
        if (zero != IntPtr.Zero)
        {
            SetForegroundWindow(zero);
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("10.75.12.10");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("username");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("password");
            SendKeys.SendWait("{TAB}");
            SendKeys.SendWait("{TAB}");
            SendKeys.Flush();
            for (int i = 0; (i < 60) && (zero == IntPtr.Zero); i++)
            {
                Thread.Sleep(500);
                hwndChild = FindWindowEx(zero, IntPtr.Zero, "Button", "Register");
            }
            SendMessage((int)hwndChild, BN_CLICKED, 0, IntPtr.Zero);
        }
    }

person user3308131    schedule 25.07.2015    source источник


Ответы (1)


Если lpClassName равно NULL, FindWindow будет искать окно только по lpWindowName (заголовок окна). Это полезно, если класс конкретного окна является переменным,

Мой вопрос, вы даете правильный заголовок окна?

Вы можете найти его с помощью обозревателя процессов — https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

Дайте мне знать, если это решило проблему для вас.

Если это не помогло - я нашел следующий фрагмент кода:

private void SendKeysToWindow(string WindowName, string KeysToSend)
    { 
        IntPtr hWnd = FindWindow(null, WindowName);            
        ShowWindow(hWnd, SW_SHOWNORMAL);
        SetForegroundWindow(hWnd);
        Thread.Sleep(50);
        SendKeys.SendWait(KeysToSend);           
    }

Источник: Отправка нажатий клавиш из приложения C# к приложению Java - странное поведение?

person DeJaVo    schedule 25.07.2015
comment
Да, когда я отправляю ключи в окно, это работает. Я просто не могу найти кнопку в этом окне, чтобы отправить ей нажатие кнопки. - person user3308131; 25.07.2015
comment
Вы можете использовать редактор классов Java (JCE), чтобы определить имя кнопки — загрузите с class-editor.sourceforge. net и пример в codeproject.com/Articles/14292/Runtime- Редактор объектов - person DeJaVo; 25.07.2015
comment
Дайте мне знать, помогло ли это вам, если да, я добавлю его в свой ответ для полного решения для вас и других. - person DeJaVo; 25.07.2015
comment
Я буду продолжать смотреть, как в Runtime-Object-Editor не хватает чего-то, что он не будет строить (отсутствует wspy), и я все еще ищу правильный java SDK для JCE. - person user3308131; 26.07.2015
comment
Если мой ответ был полезен, пожалуйста, отметьте его как решение. - person DeJaVo; 26.07.2015