C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить выделенный текст из любого активного окна  (Прочитано 3926 раз)
Next23
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 8


« : 23 Март 2010, 18:32:05 »

Всем привет!
Помогите с кодом, FAQ читал, с дюже умными людьми говорил, но все равно .... 

Задача: при нажатии комбинации горячих клавиш скопировать выделенный текст активного окна в буффер обмена.

дошел до этого:


HWND WinHandle, EditHandle;
//глобально

//--------------------------------------- событие на HOT KEY
WinHandle = GetForegroundWindow(); //определяем активное окно
EditHandle = GetTopWindow(WinHandle); // получаем дексриптор активного дочернего окна
SendMessage(EditHandle,WM_COPY,0,0); // копируем
Memo1->PasteFromClipboard();
//---------------------------------------


Но, негодяйка работает как надо только с Блокнотом. Все остальные окна аля Explorer, Word, и пр. - не реагируют.
Мож лыжи такие, мож я...
HELP, plz!
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


« Ответ #1 : 23 Март 2010, 20:11:00 »

Код:
HANDLE WinHandle = GetForegroundWindow();
HANDLE EditHandle = GetTopWindow(WinHandle);

keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event('C', 0, 0, 0);
keybd_event('C', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

if (Clipboard()->HasFormat(CF_TEXT))
  {
  Memo1->PasteFromClipboard();
  Clipboard()->Clear();
  }
Записан
Next23
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 8


« Ответ #2 : 09 Апрель 2010, 17:12:20 »

Не, к сожалению чуда в очередной раз не произошло....
код из сообщения Zor не помог,
кстати к Zor: а причем в вашем коде вообще EditHandle? Получается что он вообще не используется...

Тогда ещё раз: горячие клавиши создаю при помощи RegisterHotKey, потом на событие вешаю все - таки
Код
POINT r;
GetCursorPos(&r);
HANDLE EditHandle = WindowFromPoint(r);
SendMessage(EditHandle,WM_COPY,1,1);
Memo1->PasteFromClipboard();
 
Вот, теперь  работает тока с болкнотом, вордом, и пр. текствыми редакторами. А из explorer - никак.

Если посылать Ctrl C - то срабатывает тока с 5-7 раза
Ну что делати... 
P/S/ Мож кто подскажет дюже вумную книжку по WIN API в Builder?  Литературы мало, а та что есть - под дельфя.
На большинстве сайтов - просто тупо переведенный help из buildera - не вариант.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


« Ответ #3 : 09 Апрель 2010, 20:30:58 »

вообще то работает. только для вашей задачи слишком много НО.

Код:
void __fastcall TMainForm::FormCreate (TObject *Sender)
{
RegisterHotKey(Handle, HOT_KEY_COPY, 0, VK_F5); // сдираем текст по F5
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormDestroy (TObject *Sender)
{
UnregisterHotKey(Handle, HOT_KEY_COPY);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::WMHotKey (TMessage &Msg)
{
if (Msg.LParamHi == VK_F5)
  {
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event('C', 0, 0, 0);
  keybd_event('C', 0, KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);

  Sleep(1000); // задержка на обработку очереди

  try
    {
    if (Clipboard()->HasFormat(CF_TEXT))
      {
      AnsiString Text = Clipboard()->AsText; // проверка на повторную вставку
      if (PrevText != Text) { PrevText = Text; Memo1->PasteFromClipboard(); }
      }
    }
  catch (...)
    { }
  }
}

копирует текст отовсюду, и из Explorer и с рабочего стола (всякие GetForegroundWindow забыл стереть в прошлый раз )
прикол в том, что программа может о-о-очень долго разгрeбaть свою очередь сообщений - в примере Speep на 1сек стоит, обычно хватает.
специально в клиборд шпионе посмотрел - текст появляется ну очень неторопливо. но появляется
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.093 секунд. Запросов: 22.