2013-05-17 2 views
1

Я звоню AHK из сценария Perl. Как захватить невыбираемый текст (например, текст в окне командной строки, но у меня нет что-то вроде параметра Edit => Mark в командной строке) из окна с использованием AHK и вернуть значение обратно в Perl-скрипт?Capture and return unselectable text

Update: Я понимаю, что я могу передавать данные между двумя сценариями чтения/записи временный файл, но я предпочел бы что-то другое ...

Я не уверен, если код Perl имеет отношение к моему вопросу , но линия, которая инициирует AHK является:

$data = `autohotkey.exe script.ahk data1 data2`; 

окном «» является корпоративной системой ERP, что я не могу напрямую запросить. Информация в «окне» отображается, но не выбирается.

+0

Можете ли вы быть более конкретным? Каков точный тип окна, из которого вы пытаетесь получить текст? Как вы открываете это окно в первую очередь? Не могли бы вы также предоставить соответствующий код Perl? – MCL

+0

Кажется, что вы хотите, чтобы ваш сценарий AHK записывался в stdout. Этого можно достичь с помощью [FileAppend] (http://www.autohotkey.com/docs/commands/FileAppend.htm). Пример: 'FileAppend, это тест stdout, *' Поскольку я не очень разбираюсь в Perl, я не знаю, как и как вы можете записать процесс stdout. Кроме того, некоторые ERP-системы предлагают функциональность для экспорта контента в буфер обмена. В частности, SAP позволяет вам это делать в некоторых случаях. Если вы уже проанализировали окно ERP с помощью шпиона окна, я полагаю, что вы ничего не можете сделать. – MCL

+0

FileAppend - это решение 1/2! Для чего это стоит, переменная '$ data' в моем коде Perl получает все stdout. Не SAP и нет такой удачи при экспорте данных из системы ERP. В настоящее время у меня есть решение с использованием плагина OCR (http://www.autohotkey.com/forum/viewtopic.php?t=74227) – shaun5

ответ

1

shaun5

Как захватить недоступного текст (например, текст в окне командной строки , но я не имею что-то вроде Edit => опции Mark в командной строке) ...

у меня есть несколько примеров:


Получить несколько строк:

ptr:=A_PtrSize ? "Ptr":"UInt", suffix:=A_IsUnicode ? "W":"A", numReaded:=data:="" 
INVALID_HANDLE_VALUE:=-1, STD_INPUT_HANDLE:=-10, STD_OUTPUT_HANDLE:=-11 
VarSetCapacity(buffer, (size:=1030)*(A_IsUnicode ? 2:1)) 

Run, % "cmd.exe",,, procID 
WinWaitActive, % "ahk_pid"procID 
;~ Input, dummyVar, % "I", % "{vk20}" ; wait a space button to press 
;~ WinGet, procID, PID, A 
SendEvent, % "{Raw}TEST WRITE TO CONSOLE" 
If !DllCall("AttachConsole", "UInt", procID, A_PtrSize ? "UInt":"") 
{ 
    WinClose, % "ahk_pid"procID 
    MsgBox, 262192, % A_LineNumber, % "Fail attach to console", % 2.5 
    ExitApp 
} 
If (hConsole:=DllCall("GetStdHandle", "Int", STD_OUTPUT_HANDLE 
            , A_PtrSize ? "Ptr":""))=INVALID_HANDLE_VALUE 
{ 
    DllCall("FreeConsole") 
    WinClose, % "ahk_pid"procID 
    MsgBox, 262192, % A_LineNumber, % "Fail retrive a handle of console", % 2.5 
    ExitApp 
} 
If !DllCall("ReadConsoleOutputCharacter"suffix, ptr, hConsole 
               , ptr, &buffer 
               , "UInt", size 
               , "UInt", 0 ; begin read from first row 
               , "UInt*", numReaded 
               , A_PtrSize ? "UInt":"") 
{ 
    DllCall("FreeConsole") 
    WinClose, % "ahk_pid"procID 
    MsgBox, 262192, % A_LineNumber, % "Fail get data from console", % 2.5 
    ExitApp 
} 
; line width is 320 pixels (property/layout/screen buffer size), 
; here I cut the unnecessary white spaces in each row 
Loop, % numReaded 
    Mod(A_Index, 320) ? data.=Chr(NumGet(buffer, (A_Index-1)*(A_IsUnicode ? 2:1) 
               , A_IsUnicode ? "UShort":"UChar")) 
       . "" : data:=RTrim(data)"`r" 
MsgBox, 262208, % A_LineNumber, % RTrim(data) ;, % 2.5 
DllCall("FreeConsole") 
WinClose, % "ahk_pid"procID 

Retrieve указанную строку:

ptr:=A_PtrSize ? "Ptr":"UInt", suffix:=A_IsUnicode ? "W":"A", numReaded:="" 
INVALID_HANDLE_VALUE:=-1, STD_INPUT_HANDLE:=-10, STD_OUTPUT_HANDLE:=-11 
VarSetCapacity(buffer, (size:=319)*(A_IsUnicode ? 2:1)) 

Run, % "cmd.exe",,, procID 
WinWaitActive, % "ahk_pid"procID 
;~ Input, dummyVar, % "I", % "{vk20}" ; wait a space button to press 
;~ WinGet, procID, PID, A 
SendEvent, % "{Raw}TEST WRITE TO CONSOLE" 
If !DllCall("AttachConsole", "UInt", procID, A_PtrSize ? "UInt":"") 
{ 
    WinClose, % "ahk_pid"procID 
    MsgBox, 262192, % A_LineNumber, % "Fail attach to console", % 2.5 
    ExitApp 
} 
If (hConsole:=DllCall("GetStdHandle", "Int", STD_OUTPUT_HANDLE 
            , A_PtrSize ? "Ptr":""))=INVALID_HANDLE_VALUE 
{ 
    DllCall("FreeConsole") 
    WinClose, % "ahk_pid"procID 
    MsgBox, 262192, % A_LineNumber, % "Fail retrive a handle of console", % 2.5 
    ExitApp 
} 
If !DllCall("ReadConsoleOutputCharacter"suffix, ptr, hConsole 
               , ptr, &buffer 
               , "UInt", size 
               , "UInt", 3<<16 ; skip some rows 
               , "UInt*", numReaded 
               , A_PtrSize ? "UInt":"") 
{ 
    DllCall("FreeConsole") 
    WinClose, % "ahk_pid"procID 
    MsgBox, 262192, % A_LineNumber, % "Fail get data from console", % 2.5 
    ExitApp 
} 
; cut the unnecessary white spaces and show 
MsgBox, 262208, % A_LineNumber, % RTrim(StrGet(&buffer, numReaded 
                 , A_IsUnicode ? "UTF-16":"CP0")) 
DllCall("FreeConsole") 
WinClose, % "ahk_pid"procID