Как получить выделенный текст в окне из другого процесса?

Тема в разделе "WASM.WIN32", создана пользователем ubil, 13 ноя 2006.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Тип контрола, в котором выделили текст в общем случае заранее неизвестен. Дескриптор этого окна так или иначе получается через глобальную каллбэк функцию-фильтр(только неизвестно пока, есть ли в данном окне в данный момент выделенный текст)
    Заранее благодарен любым советам.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    ubil
    Если GetWindowText не работает (для edit эта функция как раз и не работает), то можно попробовать через буфер обмена. Больше никак, AFAIK.
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Quantum
    В первом случае, насколько я понимаю, я получу весь текст, а не только выделенный, походу не подойдет;
    А во втором, мне интересно, как выделенный текст попадет в буфер обмена, если пользователь только выделит текст, но не нажмет ctrl+c или типа того?

    ЗЫ: The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.
    ЗЗЫ: :) To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.
    ^^^Это надо поботать... Но все-равно я не понимаю пока как я именно выделенный текст получу, а также как я узнаю что выделенный текст там есть вообще.

    ЗЗЗЫ: Windows 2000/XP: Sending a WM_GETTEXT message to a non-text static control, such as a static bitmap or static icon control, does not return a string value. Instead, it returns zero. In addition, in previous versions of Microsoft Windows and Microsoft Windows NT, applications could send a WM_GETTEXT message to a non-text static control to retrieve the control's ID. To retrieve a control's ID in Windows 2000/XP, applications can use...
    ^^^ В общем я по-прежнему пока х/з как это сделать:dntknw::dntknw::dntknw:
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    WM_GETTEXT, EM_GETSEL, а потом вырезать ненужное?
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    ubil
    Проглядел

    ctrl+c или WM_COPY можно сгенерировать программно.

    Послать WM_GETTEXT в другой процесс - это не так просто, как кажется, т.к. буфер нужно поместить в адресное пространство целевого процесса.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    смотря какой контрол.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Quantum
    AFAIK, WM_GETTEXT и копирует с другого процесса. А GetWindowText - только в пределах текущего, о чём и сказано.
     
  8. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    gilg
    Спасибо! Это точно наверное:) оно. Завтра проверю - расскажу:)
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    ubil :
    >Тип контрола, в котором выделили текст в общем случае заранее неизвестен [...]
    >Заранее благодарен любым советам.

    Пожалуйста: OCR (оптическое распознавание символов), см. www.structurise.com/kleptomania :)

    Quantum :
    >>Если GetWindowText не работает (для edit эта функция как раз и не работает), то можно попробовать через буфер обмена. Больше никак, AFAIK.
    >Послать WM_GETTEXT в другой процесс - это не так просто, как кажется, т.к. буфер нужно поместить в адресное пространство целевого процесса.

    IceStudent :
    >AFAIK, WM_GETTEXT и копирует с другого процесса. А GetWindowText - только в пределах текущего, о чём и сказано.

    Как сказать, как сказать...

    Берем WinTreeSnap (http://www.wasm.ru/forum/attachment.php?item=154),
    делаем ему ярлык, ассоциированный с комбинацией клавиш (скажем - Ctrl+Shift+W),
    выбираем на рабочем столе иконку, в ее контекстном меню нажимаем "Переименовать"
    (тем самым создавая временный edit как продолжение цепочки Progman -> SHELLDLL_DefView -> SysListView32),
    вводим новый текст, но не завершаем переименование, а жмем Ctrl+Shift+W (прежний текст потом можно восстановить: Esc).

    В последней колонке "SendMessage WM_GETTEXT /GetWindowText" полученного тестового снапшота - видим оба текста иконки.
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ну можно создать, например, shared memory section
     
  11. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Короче, пользуясь функцией SendInput посылаю сообщения клавиатурные ctrl+c/ctrl+v в данное окошко, а буфер обмена - вещь глобальная, к нему уже получить доступ не проблема...