Страница: 1 |
Страница: 1 |
Вопрос: Как еще можно получить текст кроме GetWindowText?
Добавлено: 20.03.08 13:45
Автор вопроса: dimon
Как еще можно получить текст из чужого окна кроме GetWindowText?
У окон нет своего хендла. т.е. есть главное окно с элементами- окно чарта, кнопки, надписи на форме(не графика), но хендл у всех один- главного окна. Соответственно текст получаю только "заголовок гл. окна"
Можно как то получить тексты всех элементов внутри гл. окна?
Может кто нибудь возьмется сделать кусок программы, связанный с этой задачей? С оплатой конечно.
icq 353-232-625
С API никак не могу подружиться ))
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #1
Добавлено: 20.03.08 14:46
берешь мой прошлый кусок кода, добавляешь
<llImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function EnumChildWindows(ByVal hWndParent As System.IntPtr, _
ByVal lpEnumFunc As EnumWindowsProc, ByVal lParam As Integer) As Boolean
End Function
Private Delegate Function EnumWindowsProc(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
Private Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
Dim length As Integer = GetWindowTextLength(Handle)
Dim texto_janela As System.Text.StringBuilder = New System.Text.StringBuilder("", length + 1)
Dim rc As Integer = GetWindowText(Handle, texto_janela, texto_janela.Capacity)
Dim nome_classe As System.Text.StringBuilder = New System.Text.StringBuilder("", 100)
rc = GetClassName(Handle, nome_classe, 100)
Dim str As String = nome_classe.ToString
str += " - " + texto_janela.ToString + " - " + WindowText(Handle)
ListBox1.Items.Add(str)
Return True
End Function
и окрестности этих строк в Timer1
hJanelaCima = WindowFromPoint(New Point(ptCursor.X, ptCursor.Y))
Dim length As Integer = GetWindowTextLength(fenster)
меняешь на
hJanelaCima = WindowFromPoint(New Point(ptCursor.X, ptCursor.Y))
ListBox1.Items.Clear()
EnumChildWindows(hJanelaCima, AddressOf EnumWindow, 0)
Dim length As Integer = GetWindowTextLength(fenster)
также не забудь кинуть на форму больщой ListBox1
Номер ответа: 2
Автор ответа:
dimon
Вопросов: 6
Ответов: 23
Профиль | | #2
Добавлено: 20.03.08 18:49
выдает список элементов и хендлов ( я добавил в строку str += " - " + texto_janela.ToString + " - " + WindowText(Handle) еще + " - " + Handle.ToString )
в таком виде:
PTIODEVICE - - - 264598
PTIODEVICE - - - 264616
PTIODEVICE - - - 264590
Shell Embedding - - - 264588
Shell DocObject View - - - 264618
Internet Explorer_Server - - - 395634
Shell Embedding - - - 264614
Shell DocObject View - - - 264594
Internet Explorer_Server - - - 264584
Shell Embedding - - - 264592
Shell DocObject View - - - 264610
Internet Explorer_Server - - - 330162
Но текстов с элементов нет.- не видит?
Через nome_classe можно задать целевое окно?
типа WindowText(nome_classe) ?
Номер ответа: 3
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #3
Добавлено: 20.03.08 20:23
да, не показывается текст многих элементов.
nome_classe это класс окна, а не хэндл, если хочешь его фильтровать, то и писать нужно что-нить типа
Dim nome_classe As System.Text.StringBuilder = New System.Text.StringBuilder("", 100)
rc = GetClassName(Handle, nome_classe, 100)
If nome_class = "Internet Explorer_Server" Then ... Else ...
опиши, что именно ты хочешь получить, если цель например только брать текст из эксплорера, то думаю тебе поможет статья http://www.vbstreets.ru/VB/Articles/66050.aspx
Номер ответа: 4
Автор ответа:
dimon
Вопросов: 6
Ответов: 23
Профиль | | #4
Добавлено: 20.03.08 20:59
Нет экплорер не нужен. Спиок выше это список элементов главного окна, с которого мне нужты тексты элементов. Internet Explorer_Server- это описатель окна чарта.
Кстати Windows spy из Autohotkey более полно показывает описатели: Internet Explorer_Server=>Internet Explorer_Server 1 или Internet Explorer_Server 2
Не хочется здесь говорить конкрето что нужно. Можешь в асю стукнуть?
В принципе моя задача похожа на :
запустить интернет нарды из стандартых игр Windows, и прочитать все тексты с этого окна. ( там чарт правда читается, а остальное так же как и в моей задаче)
Номер ответа: 5
Автор ответа:
dimon
Вопросов: 6
Ответов: 23
Профиль | | #5
Добавлено: 20.03.08 21:21
В принципе с чатом я решил проблему, но тупо: прога ставит курсор на чат, делает клик, посылает ctrl+a, потом ctrl+с- текст в буфере.
но это не решает проблемы с остальными элементами, да быть првязанным к координатам дисплея не хочется
Номер ответа: 6
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #6
Добавлено: 20.03.08 22:39
есть действенный способ, но не реализуемый на дотнете. Нужно хукать TextOutW и еще несколько функций. По координатам можно понять куда выводится текст, и дальше отсекать нужный. Я такое делал, задачка веселая Но на дотнете мало выполнимая.