Я неправильно ссылаюсь на hwnd? Невозможно получить текст из простого окна блокнота с помощью AutoHotkey - PullRequest
0 голосов
/ 06 апреля 2020

Когда я запускаю этот скрипт, у меня открывается окно блокнота с текстом "test.txt - Notepad". Переменная id правильно заполняется массивом hwnd из подфункции ControlListHwnd. Затем он перебирает все элементы управления, найденные для блокнота (их очень мало).

Скрипт:

!t::  ;To retrieve the formatted text and paste:
{
    DetectHiddenText, On
    DetectHiddenWindows, On

    MsgBox, Starting

    WinGet, id, ControlListHwnd, test.txt - Notepad, , Program Manager
    Loop, Parse, id, `n
    {
         this_id := %A_LoopField%
         ;this_id := id%id_Index%
         ;this_id := id
         ;WinActivate, ahk_id %this_id%
         WinGetClass, this_class, ahk_id %this_id%
         WinGetTitle, this_title, ahk_id %this_id%
         ;MsgBox, 4, , Visiting All Windows`n%A_Index% of %id%`nahk_id %this_id%`nahk_class %this_class%`n%this_title%`n`nContinue?


         ControlHwnd := %A_LoopField%
         ControlGetText, outputText, , ahk_id %ControlHwnd%
         MsgBox, 4, , All Controls`n id - %A_LoopField% `n Control Text - %outputText%`n Class - %this_class% `n Title - %this_title% `n `n Continue?

         IfMsgBox, NO, break
    }

    MsgBox, Finished - %id% - end

    return
}

Когда он перебирает, он должен отобразить окно сообщения, содержащее запрашивается текст, класс и заголовок из элемента управления.

Похоже, я неправильно передаю hwnd? Или еще есть лучший способ сделать это?

В прошлом я использовал прямые вызовы Dll для User32 \ GetWindow, надеясь, что я могу сделать это с AutoHotkey с его существующими функциями.

1 Ответ

1 голос
/ 06 апреля 2020

Это классическая c ошибка путаницы устаревшего синтаксиса с новым синтаксисом выражения.
В частности, эти две строки:
this_id := %A_LoopField%
ControlHwnd := %A_LoopField%

В устаревшем назначении (=) вы действительно ссылаетесь на переменную, заключая ее в % %, но в выражении (которое вы получаете, когда используете :=), вы ссылаетесь на переменные, просто набирая ее:

this_id := A_LoopField
ControlHwnd := A_LoopField

Нет % s.

Mis c stuff:
Метки горячих клавиш не нужно переносить в { } s, если вы не знали.
И нет необходимости устанавливать

DetectHiddenText, On
DetectHiddenWindows, On 

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


Вот ваш полный скрипт с использованием синтаксиса выражений.
В целом, я бы рекомендовал прекратить использовать устаревший синтаксис, это уже не 2008.
Вы можете начать изучение различий между унаследованным и синтаксисом выражений здесь

DetectHiddenText, On DetectHidden Windows, On

!t::
     MsgBox, Starting

     ;parameters that are started with a % followed up by a space
     ;are automatically evaluated as expressions
     ;using it to just be able to quate straight text parameters
     ;could be considered overkill, but I'll just convert everything
     ;to expression syntax for the sake of the demonstration

     ;also, I'd change "test.txt - Notepad" to "ahk_exe notepad.exe"
     WinGet, id, ControlListHwnd, % "test.txt - Notepad", , % "Program Manager"
     Loop, Parse, id, `n
     {
          this_id := A_LoopField
          WinGetClass, this_class, % "ahk_id " this_id
          WinGetTitle, this_title, % "ahk_id " this_id

          ControlHwnd := A_LoopField
          ControlGetText, outputText, , % "ahk_id " ControlHwnd
          MsgBox, 4, , % "All Controls`n id - " A_LoopField "`n Control Text - " outputText "`n Class - " this_class "`n Title - " this_title "`n `n Continue?"

          IfMsgBox, No
               break
     }
     MsgBox, % "Finished - " id " - end"
return
...