Если 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.