Выполните Ctrl-C в определенном окне, не фокусируя его

У меня есть приложение, которому я хочу отправить комбинацию клавиш Ctrl-C. Я пытаюсь использовать SendMesssage, но знаю, что приложение проверяет комбинацию Ctrl-C, используя GetKeyState и GetAsyncKeyState, поэтому SendMessage довольно бесполезно... Как я могу отправить < kbd>Ctrl-C в это окно без вызова SetForegroundWindow(hWnd)? Мне нужно решение, которое работает без фокусировки/переноса в окно.

Я временно использую этот код (но требует внимания):

SetForegroundWindow(hWnd);
SendKeys.SendWait("^(c)");

Я использую C#, но код C++ в порядке.


person Darxis    schedule 29.08.2013    source источник
comment
Я считаю, что на этот вопрос уже был дан ответ. См. stackoverflow.com/questions/11512373/   -  person barrypicker    schedule 29.08.2013
comment
@barrypicker Мне нужно решение, которое работает без фокусировки / выведения на передний план окна.   -  person Darxis    schedule 29.08.2013
comment
@Darxis Взгляните на это: заголовок stackoverflow.com/questions/813086/   -  person Peter L.    schedule 29.08.2013
comment
@ПитерЛ. Я не хочу завершать работу приложения с помощью Ctrl-C. Я хочу отправить Ctrl-C на дескриптор окна, который затем скопирует что-то в буфер обмена. WM_COPY и другие сообщения не работают, так как приложение проверяет GetKeyState   -  person Darxis    schedule 29.08.2013
comment
SendMessage с некоторыми WM_KEY*?   -  person chris    schedule 29.08.2013
comment
@chris GetKeyState не работает с SendMessage   -  person Darxis    schedule 29.08.2013
comment
@Darxis, о, понятно. Вы уверены, что приложение проверяет именно так? Это не кажется слишком нормальным (зачем активировать копию, когда ваше окно не активно). Если он действительно использует GetKeyState, он должен обнаружить простой SendInput.   -  person chris    schedule 29.08.2013
comment
@chris Да, я уверен, что это приложение проверяет GetKeyState, я использовал отладчик, я уверен на 100%. Я просто хочу автоматизировать команду копирования. Я читал о SendInput, но он требует фокусировки на окне.   -  person Darxis    schedule 29.08.2013
comment
Однако GetKeyState не требует, чтобы ваше окно было сфокусировано. Вот почему отправка его так же, как пользователь, нажимающий его, должна работать, если приложение использует GetKeyState.   -  person chris    schedule 29.08.2013
comment
@chris Да, но SendMessage не запускает GeyKeyState. Если бы я использовал SendInput, который, вероятно, сработает, мне пришлось бы сначала сфокусировать окно, прежде чем использовать SendInput. SendInput не может принимать в качестве параметра дескриптор окна.   -  person Darxis    schedule 29.08.2013
comment
Я только что попытался создать поток, который ожидает нажатия клавиши пробела с зацикленным GetAsyncKeyState (асинхронным, потому что у меня нет цикла сообщений, но почти то же самое). Мой основной поток ждет три секунды и использует SendInput для отправки пробела. Мой другой поток определенно ловит его, когда окно не сфокусировано.   -  person chris    schedule 29.08.2013
comment
@chris Да, ты прав, моя ошибка. Поэтому я должен вернуться в свой отладчик, потому что с SendInput, когда окно не сфокусировано, оно не работает.   -  person Darxis    schedule 29.08.2013
comment
Я также хотел бы отправить Ctrl-C ТОЛЬКО этому приложению, он не должен быть виден другим окнам, как это делает SendMessage.   -  person Darxis    schedule 29.08.2013
comment
И что странно, на SendMessage приложение реагирует WM_RBUTTONDOWN, WM_RBUTTONDOWN, WM_LBUTTONDOWN, WM_LBUTTONUP...   -  person Darxis    schedule 29.08.2013
comment
Без активации этого приложения или собственного окна, скорее всего, что-то еще должно получить эти нажатия клавиш. Я не думаю, что возможно запустить GetKeyState без этого.   -  person chris    schedule 29.08.2013


Ответы (1)


Давным-давно, когда я занимался автоматизацией системного администратора, я использовал AutoIT. Это было давно, но если вы не против забрать их .dll...

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

Метод AutoIT ControlSend

person Slack Shot    schedule 29.08.2013
comment
Хм, не пробовал, попробую, если получится :) - person Darxis; 29.08.2013