Я пытался управлять другим приложением, чтобы автоматизировать процесс, который мы делаем 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.Что я могу сделать или попробовать по-другому.Любые предложения приветствуются.Я думаю, что часть моей проблемы может быть решена, если я смогу получить дескриптор к дочернему окну основного приложения, но не могу выполнить шов и не уверен, что делаю неправильно.
В качестве теста я скачал бесплатный регистратор макросов мыши / нажатия клавиш.Не удалось контролировать окно хуже, чем я.