1 (изменено: Tatrin, 2011-11-25 19:58:25)

Тема: AHK: Чтение текста из контролов всех окон

Вот что мне нужно сделать:
приходит id процесса, мне нужно найти окно которое соответствует этому процессу и вытянуть из него весь текст включая текст контролов и записывать их в текстовый документ.

на данном этапе дошел до следующего скрипта:

DetectHiddenWindows,on
DetectHiddenText, on
WinGet, id, list,,, Program Manager
Loop, %id%
{
    this_id := id%A_Index%
    WinActivate, ahk_id %this_id%
    WinGet, ControlList, ControlList,A
    WinGetText,  this_text,  ahk_id %this_id%
 ;   ControlGet, List, List, Selected, SysListView321, WinTitle
    FileAppend, %this_text% `n, D:\1.txt
}

Может кто подсказать как это сделать?

2 (изменено: ypppu, 2011-11-25 21:41:06)

Re: AHK: Чтение текста из контролов всех окон

Tatrin, прочитайте первую тему в этом разделе. Затем исправьте заголовок темы, отредактировав первое сообщение. Оформите код правильно.

3 (изменено: Александр_, 2011-11-25 21:21:44)

Re: AHK: Чтение текста из контролов всех окон

Tatrin пишет:

Вот что мне нужно сделать:
приходит id процесса, мне нужно найти окно которое соответствует этому процессу и вытянуть из него весь текст включая текст контролов и записывать их в текстовый документ.
...
Может кто подсказать как это сделать?

так?

FindWindowEx(hwndParent, hwndChildAfter, ClassName, WindowName)
{
   return DllCall("FindWindowEx", "uint", hwndParent, "uint", hwndChildAfter, "uint", ClassName, "uint", WindowName, "uint")
}
EnumChild(hwndParent, byref str, byref prestr)
{
   cur:=FindWindowEx(hwndParent, 0, 0, 0)
   if (cur=0)
   {
      return
   }
   str:=str . prestr . "{`n"
   prestr:=prestr . "   "
   while (cur<>0)
   {
      WinGetClass ClassName, ahk_id %cur%
	  WinGetText WindowText, ahk_id %cur%
	  WindowText := RegExReplace(WindowText, "\r\n|\n|\r", "\n")
	  str:=str . prestr . "ClassName '" . ClassName . "', WindowName '" . WindowText . "'`n"
	  EnumChild(cur, str, prestr)
      cur:=FindWindowEx(hwndParent, cur, 0, 0)
   }
   prestr:=SubStr(prestr, 1 , StrLen(prestr)-3)
   str:=str . prestr . "}`n"
}

DetectHiddenWindows on
DetectHiddenText on
pid:=4848 ; идентификатор нужного процесса
WinGet id, list, ahk_pid %pid%
str:="" ; строка для записи в файл
prestr:="" ; пробелы для читабельности
Loop, %id%
{
    this_id := id%A_Index%
	WinGetClass, ClassName, ahk_id %this_id%
	WinGetTitle, WindowName, ahk_id %this_id%
	str:=str . "ClassName '" . ClassName . "', WindowName '" . WindowName . "'`n"
	EnumChild(id%A_Index%, str, prestr)
}
FileDelete %a_scriptdir%\1.txt 
FileAppend %str%, %a_scriptdir%\1.txt

4

Re: AHK: Чтение текста из контролов всех окон

В этом примере в файл записывается вся информация со всех окон, а мне нужен текст только окна указанного процесса. Извините если чего-то не понимаю, я в AHK новичок. Как я понимаю нужно добавить проверку на PID для каждого полученного окна, или для каждого окна надо еще применять функцию ControlGetText?

5

Re: AHK: Чтение текста из контролов всех окон

Tatrin пишет:

В этом примере в файл записывается вся информация со всех окон

О_о
В этом примере записываются только имя класса и текст из всех окон указанного процесса.

6

Re: AHK: Чтение текста из контролов всех окон

Извините за невнимательность. Попробовал в работе этот скрипт на примере запущенного блокнота. Выводится класс и название блокнота, но текст который в нем записан не отображается. Не подскажите как его прочитать?

7

Re: AHK: Чтение текста из контролов всех окон

Tatrin пишет:

Выводится класс и название блокнота, но текст который в нем записан не отображается. ...как его прочитать?

Gui, Add, Edit, vControlText x12 y10 w450 h350
Gui, -MaximizeBox
Gui, Show, Center w474 h372, Test
ControlGetText, CText, Edit1, ahk_class Notepad ; Edit1 - название контрола содержащего текст
GuiControl,, ControlText, % CText ? CText:"Блокнот не запущен, или не имеет текста!"
Return

GuiClose:
   ExitApp

F5::Reload
Esc::ExitApp

8

Re: AHK: Чтение текста из контролов всех окон

Tatrin пишет:

Извините за невнимательность. Попробовал в работе этот скрипт на примере запущенного блокнота. Выводится класс и название блокнота, но текст который в нем записан не отображается. Не подскажите как его прочитать?

Нужно "WinGetText WindowText, ahk_id %cur%" заменить на "ControlGetText WindowText,, ahk_id %cur%". Но в общем случае нужно проверить, является ли окно контролом(свойство WS_CHILD) и вызвать соответствующую функцию.