Горячий ключ полностью скрывает сообщение от других окон, как вы сказали. Что вам нужно сделать, так это найти окно с фокусом, а затем прочитать текст, который он выбрал (и, возможно, добавить его в буфер обмена вручную, я думаю?)
Этот фрагмент должен найти сфокусированное окно. Это на C++, но вы можете легко перевести его на C#.
HWND GetGlobalFocus()
{
GUITHREADINGO info;
info.cbSize = sizeof(info);
if (!GetGUIThreadInfo(0, &info))
return NULL;
return info.hwndFocus;
}
После того, как вы это сделаете, это становится сложным. Вы можете сделать PostMessage(hWnd, WM_COPY, 0, 0);
, но он не будет работать, если элемент управления не поддерживает это (любой выделенный синтаксис элемент управления, скорее всего, не является стандартным и, как таковой, может не отвечать на это).
Вы можете вручную отправить сообщение WM_GETTEXT
, чтобы получить текст, а затем вручную добавить его в буфер обмена, но опять же это скорее всего не удастся его контролировать в значительной степени нестандартным, не говоря уже о том, что он не сохранит приложения возможно несколько форматов буфера обмена (думаю, Word).
Другой вариант - когда вы получаете горячую клавишу, отключите свой крючок, снова отправьте комбинацию клавиш с keybd_event
, а затем снова включите свой крючок, и у вас будут данные в вашем буфере обмена. Это кажется неуклюжим, но может работать, если keybd_event
блокирует или нет, я не могу вспомнить.
Надеюсь, это поможет!
FrEaKmAn: Можете ли вы изменить название своего вопроса, чтобы сделать его более понятным? так как из моего ответа я ушел ниже, я неправильно интерпретировал его. – t0mm13b