Взять под контроль другое приложение с помощью sendkeys или окна API не работает - PullRequest
2 голосов
/ 18 ноября 2011

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

РАУНД 1: Я пытался .Net SendKeys отправить alt + c: AppActivate («Менеджер многоканальных заказов») 'Получить фокус на мое приложение, которым я хочу управлять

THEN: SendKeys.SendWait ('% C') или SendKeys.Send ('% C') или SendKeys.SendWait ('% c') или SendKeys.Send ('% c') не привели к тому, что в моем приложении ничего не происходило.Если я посылаю alt, а затем 'c', приложение отвечает, но не комбо.Когда я отправляю их отдельно, приложение не делает то, что мне нужно, они должны быть вместе.Все сочетания клавиш Alt терпят неудачу, но одиночные нажатия клавиш работают.

РАУНД 2: Я попытался отправить нажатия клавиш с помощью API FindWindow и PostMessage:

    Dim ParenthWnd As New IntPtr(0)
    Dim hWnd As New IntPtr(0)
    Dim iRetval As Integer

    ParenthWnd = FindWindowByClass("momwin9c000000", 0)
    If ParenthWnd.Equals(IntPtr.Zero) Then
        Beep()
    Else

        iRetval = SendMessage(ParenthWnd, WM_KEYDOWN, Keys.Alt, 0)
        iRetval = SendMessage(ParenthWnd, WM_KEYUP, Keys.C, 0)
        iRetval = PostMessage(ParenthWnd, WM_KEYUP, Keys.Alt, 0)

    End If

Это тоже не удалось, возможно, потому что яне пишет в правильное дочернее окно приложения?Я пытался использовать Spy ++, чтобы попытаться выяснить это, но не знаю, что я делаю неправильно.

КРУГЛЫЙ 3: Используя Spy ++, я попытался выяснить, какие команды я должен отправлять, но снова, может быть, яне до конца понимаю, что я должен делать.

    Dim ParenthWnd As New IntPtr(0)
    Dim hWnd As New IntPtr(0)
    Dim iRetval As Integer

    ParenthWnd = FindWindowByClass("momwin9c000000", 0)
    If ParenthWnd.Equals(IntPtr.Zero) Then
        Beep()
    Else
        ' Have the window handle 
        Dim ChildhWnd As New IntPtr(0)
        ChildhWnd = FindWindowEx(ParenthWnd, IntPtr.Zero, "momwin9c000000", "MOM Main Menu Toolbar")
        If ChildhWnd.Equals(IntPtr.Zero) = False Then
            iRetval = PostMessage(ParenthWnd, WM_KEYUP, &H12, &HD0380001)
            iRetval = PostMessage(ChildhWnd, WM_KEYUP, Keys.ShiftKey, 0)
            iRetval = PostMessage(ChildhWnd, WM_KEYUP, Keys.Alt, 0)
        End If
    End If

РАУНД 4: На одном из пунктов, которые я не упомянул, окно приложения разделено на 2 панели.Я не могу переходить с одной панели на другую, но могу (используя клавиатуру) alt + c, что я и пытаюсь выполнить.Таким образом, четвертый раунд пошел на подход с помощью мыши.Я попытался переместить положение мыши в известное место текстового поля, в которое я пытаюсь переместить фокус, и щелкнув.

    Cursor.Position = Me.PointToScreen(New Point(200, 180))
    mouse_event(MOUSEEVENTF_LEFTDOWN, 200, 180, 0, 0)

При этом указатель мыши переместился в центр текстового поля на нижней панели.и щелкает, однако, фокус остается на верхней панели и перемещается только к следующему текстовому полю, почти как нажатие клавиши.

РЕЗЮМЕ: Я не понимаю, в чем разница между фактическим нажатием клавиши alt + cи либо версия sendkeys, либо версия API Windows, но реальные нажатия клавиш работают, и мои попытки терпят неудачу.То же самое с разницей между фактическими щелчками мыши и моей попыткой API mouse_event.Что я могу сделать или попробовать по-другому.Любые предложения приветствуются.Я думаю, что часть моей проблемы может быть решена, если я смогу получить дескриптор к дочернему окну основного приложения, но не могу выполнить шов и не уверен, что делаю неправильно.

В качестве теста я скачал бесплатный регистратор макросов мыши / нажатия клавиш.Не удалось контролировать окно хуже, чем я.

1 Ответ

0 голосов
/ 19 ноября 2011

2,3 - проблема с Alt и Ctrl в том, что приложения проверяют состояние клавиатуры, чтобы выяснить, нажаты ли они, а не очередь событий.Вот почему SendMessage не работает.keybd_event работает, хотя он устарел (и вместо него следует использовать SendKeys / SendInput:)

1 - не пропустили ли вы конфигурацию (согласно Есть ли разница между keybd_event () и SendKeys.SendWait() );А также FindWindow () / SetForegroundWindow () может работать лучше, чем AppActivate?

...