Горячая клавиша полностью скрывает сообщение от других окон, как вы сказали. Что вам нужно сделать, это найти окно с фокусом и затем прочитать выделенный текст (а затем, возможно, добавить его в буфер обмена вручную?)
Этот фрагмент должен найти сфокусированное окно. Это на 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
или нет, я не помню.
Надеюсь, это поможет!