Использование WinAPI SendMessage в C # для имитации ОДНОГО ОКНА ОДНОГО ЖЕ ПРИЛОЖЕНИЯ, получающего нажатия клавиш, отправленные ДРУГИМ ОКНОМ ОДНОГО ЖЕ ПРИЛОЖЕНИЯ - PullRequest
0 голосов
/ 30 января 2019

во-первых, это не дубликат, мой случай очень конкретный, я просмотрел ответы здесь и опробовал их, они, похоже, не работают, по крайней мере, в моем случае.

У меня проблема:

  1. У меня есть одно приложение C # WinForms, которое содержит форму с элементом управления webBrowser.
  2. Мне нужна форма для отправки нажатий клавиш VIA SendMessage WinAPI в элемент управления webBrowser,так что элемент управления обрабатывает их правильно и запускает все связанные события JS на отображаемой странице.
  3. Я делаю стандартную вещь SendMessage, но я подозреваю, что проблема заключается в том, что я поставляю webBrowser.Handle как HWND для SendMessage, может быть?

Для простоты я просто делаю:

  1. webBrowser.Navigate ("https://www.google.com")
  2. тогда я нахожуокно ввода поиска с помощью webBrowser.Document.GetElementsByTagName и некоторой фильтрации. Это работает правильно, потому что тогда я вызываю element.Focus (), который корректно фокусирует мой курсор в поле поиска
  3. ТО я использую SendMessage (также пробовал PostMessage) для отправки Keys.M в webBrowser.Handle HWND.
  4. Функция работает правильно и возвращает 0 (без ошибок), но нажатие клавиш не обрабатываетсяи буква не появляется в поле ввода страницы.

ДА, мне абсолютно определенно необходимо использовать какое-то моделирование ввода, потому что я хочузапустить автоматическую обработку, которую webBrowser выполняет для фактических нажатий клавиш, чтобы он запускал все связанные функции JS, прикрепленные на странице.

ДА, я абсолютно точно определенно нуждаюсь в этомэто работает, даже когда окно получателя свернуто, и когда на компьютере происходит фактический пользовательский ввод.Если кто-то на самом деле не отобразит окно получателя и не начнет щелкать и вводить текст внутри него, ни один фактический ввод на компьютере не должен мешать работе моего приложения.

ДА, у меня есть оба этих окна, поскольку они оба в моем собственном приложении.

Я подозреваю, что проблема в том, что в настоящее время это фактически одно окно?Форма содержит элемент управления webBrowser, и форма отправляет SendMessage в элемент управления webBrowser, используя его свойство .Handle.

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

Является ли проблема отправкой сообщения на дескриптор, принадлежащий конкретному элементу управления в окне?

Или ... есть идеи?Любые предложения о том, что нужно остерегаться?Или как сделать это лучше?

1 Ответ

0 голосов
/ 30 января 2019

Хорошо, в этом случае проще, чем на самом деле общаться с другим приложением. SendKeys.Send () - это ключ ... хе ...

, но прежде чем отправлять ключ, убедитесь, что вы сосредоточены на правильном элементе управления, что означает:

webBrowser.Focus()
//then pageElement.Focus(), if necessary
//and then
SendKeys.Send();

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

Спасибо мне.

...