Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Программно ctrl+V в окно другого приложения


Автор: Rockie 9.9.2009, 12:49
Добрый день!

Сделал тривиальную программулину, которая скидывает в clipboard число и время. У меня есть софтина, с её помощью я вешаю свою программу на определённый хоткей("Hotkey Manager"). Нажимаю клавишу, в буфере появляется число, потом руками нажимаю ctrl+v. 

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

С консольным приложением понятно фокус переходит на консоль; если делаю Win Forms Application и удаляю форму из приложения вставка куда мне надо тоже не происходит.

В общем я вообще не очень понимаю как реализовать вставку в текущее окно, откуда было вызвана программулина - неужто писать сервис, который будет вешать хук на горячую клавишу, потом мониторить окно из которого был вызов, и осуществлять вставку?

p.s.: в общем хз как описал вопрос, надеюсь вы меня хоть на 75% поняли

Автор: LamerTM 12.9.2009, 20:42
Если передавать текст (минуя буфер обмена), то сообщение надо послать в нужное окно функцией SendMessage. Фокус окну в этом случае не нужен.
Возможно можно послать сообщение WM_COMMAND, и окно примет содержимое буфера обмена. В этом случае фокус тоже не нужен. Правда я имитировал Ctrl+C таким образом (через WM_COMMAND), будет ли работать Ctrl+С не знаю.
Если надо именно нажать клавиши Ctrl+V, то надо переключить фокус окну (есть API-функция для этого SetForegroundWindow), потом послать в него нужную комбинацию клавиш функцией SendInput. Фокус после этого можно вернуть предыдущему окну той же функцией.

Автор: Любитель 12.9.2009, 23:32
Хук надо ставить - само собой. Но сервисы тут не причём.

Автор: jonie 13.9.2009, 22:35
а нафига именно ctrl+v ? обычное http://msdn.microsoft.com/en-us/library/ms632644%28VS.85%29.aspx не подходит чтоли?

Автор: Любитель 14.9.2009, 01:17
Да какая разница в данном случае? Проблема автора в таком случае сведётся к получениюхендла окна, бывшего активным до запуска его программы. Короче, ошибка в самом подходе (вместо хука вешается непонятным образом хоткей, который тупо вызывает программу, без запоминания текущего состояния).

Автор: Rockie 14.9.2009, 14:53
Спасибо всем за ответы!

Цитата(Любитель @  14.9.2009,  01:17 Найти цитируемый пост)
Проблема автора в таком случае сведётся к получениюхендла окна, бывшего активным до запуска его программы

Именно. 

То есть для вставки как понял мне в любом случае нужно делать хук, а уже в нём через GetForeGroundWindow получить активное окно, и в нем сделать GetData.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)