Используйте SendMessage в C # для выполнения операции CTRL-C с заданным дескриптором. - PullRequest
0 голосов
/ 02 апреля 2010

В Google Chrome вы можете получить текст предупреждения / диалогового окна JavaScript, просто открыв диалоговое окно и нажав CTRL-C в диалоговом окне. Это поместит текст в диалоге в буфер обмена.

Я пытаюсь использовать SendMessage для отправки CTRL-C для выполнения копирования текста диалога JavaScript. Мне уже удалось сделать это с помощью SendInput, но, к сожалению, это может привести к сбою, если окно не имеет фокуса.

Я пытался использовать SendMessage с сообщением WM_COPY, но это не сработало для моих нужд.

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

Ответы [ 4 ]

0 голосов
/ 21 марта 2016

Я понимаю, что это древний вопрос, но, поскольку он не получил удовлетворительного ответа, позвольте мне поблагодарить любого, кто ищет:

SendMessage() не требуется.Просто используйте:

System.Windows.Forms.SendKeys.SendWait("^(c)");

А если вы хотите вставить:

System.Windows.Forms.SendKeys.SendWait("^(v)");
0 голосов
/ 02 апреля 2010

Поскольку вопрос немного неясен относительно того, говорите ли вы об отправке сочетания клавиш Ctrl + C для завершения процесса или о копировании выделения в буфер обмена. Если это первое, см. Этот ответ здесь и здесь на SO, который был задан в предыдущем случае, когда OP спрашивал, как отправить нажатия клавиш Ctrl + C процесс оболочки, чтобы прекратить его.

Если вы говорите о Ctrl + C для копирования выделения в буфер обмена, то еще сложнее выяснить, действительно ли выделение было выбрано первым до копирования в буфер обмена ...

Если я ухожу не туда, по крайней мере, отредактируйте свой вопрос, чтобы сделать его более понятным!

0 голосов
/ 02 апреля 2010

Если WM_COPY терпит неудачу, есть несколько путей, которые вы можете попробовать ...

Чтобы подделать нажатие клавиши, вы можете отправлять сообщения WM_KEYDOWN и WM_KEYUP.

Но что вы отправляете в сообщении? Если вы отправите «c», то в этих сообщениях вы не сможете сообщить приложению, что ctrl также был удержан.

Возможно, вы сможете отправить символ 0x03 (который является кодом символа, который фактически генерирует ctrl + c), но нет никакой гарантии, что принимающее приложение будет интерпретировать это как действие "ctrl + c".

Почему это может не сработать? Принимающая заявка может ...

  • игнорировать WM_KEYDOWN и WM_KEYUP и использовать другие средства для чтения с клавиатуры (например, GetAsyncKeyState, чтобы увидеть, не нажата ли клавиша)
  • обрабатывает сообщения WM_KEYDOWN и / или WM_KEYUP, но ищет «c» и затем использует GetAsyncKeyState () или аналогичный, чтобы определить, не работает ли ctrl при обработке сообщения.
  • Он может по-прежнему игнорировать сообщения, если у него нет фокуса ввода, или, что еще хуже, обрабатывать эти сообщения, как если бы они были получены через окно фокуса ввода.

Итак - попробуйте, но это может не сработать.

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

Другой подход (возможно, самый лучший) заключается в том, что если это известный вам диалог, содержащий статическое текстовое поле, вы можете просто найти этот дочерний элемент управления и GetText (отправить сообщение WM_GETTEXT) и избежать используя буфер обмена вообще. (Или, если вам нужен текст в буфере обмена, возьмите его вот так, а затем поместите его в буфер обмена самостоятельно). Это позволило бы не обманывать приложение предоставлением текста и не возвращаться к стандартному поведению Windows.

0 голосов
/ 02 апреля 2010

Попробуйте использовать эти

WM_CUT = 0x300
WM_COPY = 0x301
WM_PASTE = 0x302
WM_CLEAR = 0x303

как параметр wmsg в зависимости от вашей операции.

...