Страница: 1 |
Вопрос: clipBOOard | Добавлено: 02.08.09 20:03 |
Автор вопроса: ![]() |
Такое дело. Нужно стырить выделенный текст из контрола, находящегося под фокусом. При этом контрол не принадлежит моей программе. Погуглил кучу всяких примеров с хуками и прочими извратами, вроде приемлемо, но оказалось, что работают они не везде, например, в MsWord или VisualStudio (видимо из-за того, что контролы рисованы заново). Пришел к выводу, что кроме изврата в виде
Clipboard.Clear keybd_event VK_CONTROL, 0, 0, 0 keybd_event VK_C, 0, 0, 0 keybd_event VK_CONTROL, 0, &H2, 0 keybd_event VK_C, 0, &H2, 0 S = clipboard.GetText ничего не сделать. И то это работает через раз (но зато везде :D). Народ плиз помогите, либо как эту васю заставить работать, либо вообще что-то более нормальное) Заранее благодарен. |
Ответы | Всего ответов: 14 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #1 | Добавлено: 02.08.09 22:12 |
Отовсюду текст не вынеш, бывает такое. Сэндмессэйдж с геттекстом пробовал? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 03.08.09 08:52 |
Пробовал. Там на то, чтобы добраться до HWND этого контрола кучу кода народ пишет (который вылетает через раз) с хукми и всякой фегней, не то, чтобы на сам сендмесседж. А сендмеседж не работает. Думаю все-таки буфер обмена - самый стабильный вариант. Но если его делать через SendMessage WM_COPY, то нужно узнать hWnd активного контрола, тут тоже встает проблема. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 03.08.09 10:58 |
Или есть нормальный способ узнать HWND контрола чужого окна, который находится под фокусом? |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #4 | Добавлено: 03.08.09 16:21 |
Если через апи не считается ненормальным, то есть.
Исключение когда текст это рисунок или контролы недоступны. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 04.08.09 10:49 |
АПИ - это очень хорошо, хотелось бы узнать как)) Плиз)
MS Word гад не обрабатывает кажись сообщения GETTEXT и т.п. поэтому я не уверен, что не через буфер обмена получится из него выципить текст. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #6 | Добавлено: 04.08.09 16:14 |
Применять апи к мсворду както странно, поздним связыванием не легче?
Подключись к модели и командуй. Пример с апи скину позже. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 04.08.09 17:03 |
Спасибо. Суть в том, что мне нужно подрубиться к любому приложению, независимо от того, чем оно является - браузер, блокот, 1С, ворд, переиминование файла - не суть, нужно схавить выделенный текст. С моей точки зрения имитировать нажатие Ctrl+C было бы самым надежным.... |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #8 | Добавлено: 04.08.09 18:34 |
[source]Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_GETTEXTLENGTH = &HE Private Const WM_GETTEXT = &HD Private Sub Main() Dim WindowhWnd As Long Dim ObjecthWnd As Long Dim lStringLen As Long Dim sGetString As String WindowhWnd = FindWindow(vbNullString, "Пример.txt - AkelPad") ObjecthWnd = FindWindowEx(WindowhWnd, 0, "RichEdit20W", vbNullString) lStringLen = SendMessage(ObjecthWnd, WM_GETTEXTLENGTH, 0, 0) sGetString = Space$(lStringLen) WindowhWnd = SendMessage(ObjecthWnd, WM_GETTEXT, lStringLen, ByVal sGetString) MsgBox sGetString End Sub[\source] я непонял, ты из окошка с анимацией при копировании файла хочешь текст через Ctrl+C выхватить? Это непрокатит, лэбэлы клипборд не поддерживают. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 05.08.09 07:50 |
Благодарю, но это не совсем то ))) Хотя попробовать можно.
я непонял, ты из окошка с анимацией при копировании файла хочешь текст через Ctrl+C выхватить? Это непрокатит, лэбэлы клипборд не поддерживают
Нет, моя задача такова: юзер во время работы с программой (любой) выделил текст. Задача моего кода - узнать этот текст. Именно поэтому я склоняюсь к Ctrl+C. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: adamis@list.ru Вопросов: 153 Ответов: 3632 |
Профиль | Цитата | #10 | Добавлено: 05.08.09 09:03 |
Ну если только выделенный текст, то да. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 05.08.09 14:51 |
Попа в том, что код
не работает. Говорит, буфер обмена не может открыть. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #12 | Добавлено: 11.08.09 11:25 |
Не, серьезно народ, я что, упустил какую-то очевидную деталь? |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 11.08.09 11:46 |
Сейчас перебором посмотрел,
Работает.
Не работает. Непонятно. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 246 Ответов: 3333 |
Web-сайт: Профиль | Цитата | #14 | Добавлено: 11.08.09 11:56 |
Убицо об стену. Всем, кто сюда зашел, ища почему не работает keybd_event:
Вторым параметром нужно передавать то, что ты нажимаешь, обрабатывая функцией MapVirtualKey.
![]() |
Страница: 1 |
|