Страница: 1 |
Страница: 1 |
Вопрос: clipBOOard
Добавлено: 02.08.09 20:03
Автор вопроса:
VβÐUηìt | Web-сайт:
Такое дело. Нужно стырить выделенный текст из контрола, находящегося под фокусом. При этом контрол не принадлежит моей программе. Погуглил кучу всяких примеров с хуками и прочими извратами, вроде приемлемо, но оказалось, что работают они не везде, например, в 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
Автор ответа: Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #1
Добавлено: 02.08.09 22:12
Отовсюду текст не вынеш, бывает такое. Сэндмессэйдж с геттекстом пробовал?
Номер ответа: 2
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #2
Добавлено: 03.08.09 08:52
Пробовал. Там на то, чтобы добраться до HWND этого контрола кучу кода народ пишет (который вылетает через раз) с хукми и всякой фегней, не то, чтобы на сам сендмесседж. А сендмеседж не работает. Думаю все-таки буфер обмена - самый стабильный вариант. Но если его делать через SendMessage WM_COPY, то нужно узнать hWnd активного контрола, тут тоже встает проблема.
Номер ответа: 3
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #3
Добавлено: 03.08.09 10:58
Или есть нормальный способ узнать HWND контрола чужого окна, который находится под фокусом?
Номер ответа: 4
Автор ответа: Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #4
Добавлено: 03.08.09 16:21
Если через апи не считается ненормальным, то есть.
Исключение когда текст это рисунок или контролы недоступны.
Номер ответа: 5
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #5
Добавлено: 04.08.09 10:49
АПИ - это очень хорошо, хотелось бы узнать как)) Плиз)
MS Word гад не обрабатывает кажись сообщения GETTEXT и т.п. поэтому я не уверен, что не через буфер обмена получится из него выципить текст.
Номер ответа: 6
Автор ответа: Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #6
Добавлено: 04.08.09 16:14
Применять апи к мсворду както странно, поздним связыванием не легче?
Подключись к модели и командуй.
Пример с апи скину позже.
Номер ответа: 7
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #7
Добавлено: 04.08.09 17:03
Спасибо. Суть в том, что мне нужно подрубиться к любому приложению, независимо от того, чем оно является - браузер, блокот, 1С, ворд, переиминование файла - не суть, нужно схавить выделенный текст. С моей точки зрения имитировать нажатие Ctrl+C было бы самым надежным....
Номер ответа: 8
Автор ответа: Smith
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
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #9
Добавлено: 05.08.09 07:50
Благодарю, но это не совсем то ))) Хотя попробовать можно.
Нет, моя задача такова: юзер во время работы с программой (любой) выделил текст. Задача моего кода - узнать этот текст. Именно поэтому я склоняюсь к Ctrl+C.
Номер ответа: 10
Автор ответа: Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #10
Добавлено: 05.08.09 09:03
Ну если только выделенный текст, то да.
Номер ответа: 11
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #11
Добавлено: 05.08.09 14:51
Попа в том, что код
не работает. Говорит, буфер обмена не может открыть.
Номер ответа: 12
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #12
Добавлено: 11.08.09 11:25
Не, серьезно народ, я что, упустил какую-то очевидную деталь?
Номер ответа: 13
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #13
Добавлено: 11.08.09 11:46
Сейчас перебором посмотрел,
Работает.
Не работает.
Непонятно.
Номер ответа: 14
Автор ответа: VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #14
Добавлено: 11.08.09 11:56
Убицо об стену. Всем, кто сюда зашел, ища почему не работает keybd_event:
Вторым параметром нужно передавать то, что ты нажимаешь, обрабатывая функцией MapVirtualKey.