2011-07-27 5 views
0

좋아, 그래서 나를 위해 몇 가지 음성 제어 작업을 할 applescript 쓰고 있어요.입력 후 Applescript가 자동으로 대화 상자를 닫으시겠습니까?

내 목소리 제어에 Mac 용 Dragon Dictate 2.0을 사용하고 주로 코딩 용으로 AppleScript를 사용하고 있습니다. 한 번 작은 문제를 제외하고는 거의 모든 것이 제곱되었습니다. 음성 명령을 기대할 때 필자는 텍스트를 입력하라는 대화 상자를 표시합니다.

예 :

set cmd1 to the text returned of (display dialog "Speak Command:" default answer "") 

이 빈 텍스트 필드 대화 상자를 표시하고 버튼을 "취소"를

내 문제는 내가 추가 문구를 말을하지 않고 확인을 누릅니다 수있는 방법이다 "확인". 현재 음성 명령을 사용하여 "go"를 말하고 "return"키를 누른 applescript를 실행합니다. 이것은 효과가 있지만, 나는 "가라"고 말할 필요가 없다.

은 내가 자동으로 대화 상자를 닫고 특정 기간 이후에 입력을 받아

giving up after 10 

을 추가 할 수 있습니다 알고 있지만 더 나은 방법이 있어야한다.

나는 약간의 조사를 수행했으며 리턴 키 입력을 수행하기 위해 "완료된 편집"을위한 이벤트 핸들러를 가질 수 있다는 것을 알아 냈습니다. 그러나 나는 이것을 어떻게하는지 모른다. 누구나 훌륭한 의견이나 아이디어가 있다면 감사!

+0

나는 비슷한 것을 어떻게 할 수 있습니까? 받아쓰기가 명령 창에 나타나면 사용할 수 없으므로 연설문을 읽으라는 말을 할 수 없습니다.용의 지시문을 사용하지 않았기 때문입니까? – Grigor

+0

또한 가능한 경우이 코드를 볼 수 있다면 정말 좋을 것입니다. – Grigor

답변

0

"on done editing"이 가장 좋은 방법이지만 objective-c 또는 AppleScriptObjC를 사용하여 Xcode에 대화 상자를 작성해야합니다. 그것은 당신의 능력을 넘어선 것 같습니다.

능력 범위 내에서 ... "완료된 편집 중"방법을 시뮬레이션 할 수 있습니다. 대화 상자를 보여주는 첫 번째 애플 스크립트가 실행될 때 두 번째 애플 스크립트를 시작할 수 있습니다. 이 두 번째 applescript는 대화 상자의 텍스트 필드를 주기적으로 확인할 수 있습니다. 텍스트가 일정 시간 동안 변경되지 않으면 리턴 키를 누를 수 있습니다. 두 번째 applescript에서 대화 상자를 대상으로 지정하는 방법을 알아야하기 때문에 약간 복잡하지만 너무 어렵지는 않습니다. 대화 상자에 제목을 지정하고 시스템 이벤트를 사용하여 해당 제목의 창을 찾는 것이 가장 좋습니다.

별도의 applescript에서이 작업을 수행해야하는 이유는 일반 applescript가 대화 상자가 열려있는 동안 모든 명령을 일시 중지하기 때문입니다. 따라서 별도의 프로세스를 실행하여 텍스트 필드를 확인해야하며 두 번째 스크립트가 가장 쉬운 방법입니다.

편집 : 다음은 AppleScript로 처리하는 방법입니다. 먼저 편집 스크립트를 마친이 스크립트를 작성하십시오. 사용자가 텍스트 입력을 중단하면 대화 상자가 닫힙니다. 데스크톱에 onDoneEditing이라는 스크립트로 저장하십시오.

set shortDelay to 0.5 
set longDelay to 1 

delay longDelay --delay for a moment to let the dialog box from the first script launch 

tell application "System Events" 
    set theProcess to first process whose frontmost is true 
    tell theProcess 
     set dialogWindow to first window 

     -- this repeat loop looks for when the user starts entering text into the dialog box 
     repeat 
      -- get the current text field value 
      set currentValue to value of first text field of dialogWindow 

      -- if the value has changed we know text is being entered 
      if currentValue is not "" then exit repeat 

      delay shortDelay 
     end repeat 

     -- this repeat loop looks for when the user stops entering text 
     -- we know that when the text is the same after 2 checks 
     delay longDelay 
     repeat 
      set newValue to value of first text field of dialogWindow 

      if newValue is currentValue then 
       keystroke return 
      else 
       set currentValue to newValue 
      end if 

      delay longDelay 
     end repeat 
    end tell 
end tell 

이제이 스크립트를 만드십시오. 이 스크립트는 백그라운드 프로세스에서 실행되도록 명령 행 도구 "osascript"를 사용하여 위의 스크립트를 시작합니다. 그런 다음 대화 상자가 표시됩니다. 두 스크립트에서 내 의견을 읽고 각각의 작동 방식을 이해할 수 있습니다.

-- launch the onDoneEditing script 
-- we get the process id (thePID) of the launched process so we can kill it later 
set onDoneEditing to (path to desktop as text) & "onDoneEditing.scpt" 
set thePID to do shell script "osascript " & quoted form of POSIX path of onDoneEditing & " > /dev/null 2>&1 & echo $!" 

-- diaplay the dialog and make sure it will be frontmost 
tell me to activate 
display dialog "Speak Command:" default answer "" 

-- kill the onDoneEditing to make sure it's not still running 
try 
    do shell script "kill " & thePID 
end try 
+0

나는 Xcode를 가지고있다. 나는 아직 자신에게 objective-c를 가르 칠 시간이 없다. 객관적인 C로 어떻게 할 수 있는지 알고 있습니까? 훌륭한 출발점이 될 코드를 제게 제공 할 수 있다면. 나는 당신이 applescript로 말하고있는 것을 이해합니다, 유일한 문제는 대화 상자의 텍스트 필드를 주기적으로 점검하는 방법을 모르겠습니다. – tknickman

+0

다른 문제는 일단 대화 상자가 표시됩니다. 현재 백그라운드에서 실행중인 다른 모든 스크립트는 대화 상자가 닫힐 때까지 중단됩니다. – tknickman

+0

내가 설명한대로 위의 내용을 아플리케 트 솔루션으로 편집했습니다. 당신은 objective-c를 사용하기를 원하지 않습니다. 왜냐하면 그것은 당신에게 너무 복잡하기 때문입니다. objective-c를 배우는 것뿐만 아니라 interface builder를 사용하여 대화 상자 창을 만드는 방법도 배울 필요가 있습니다. 애플 스크립트가 잘 작동하기 때문에 모든 것을 배울 이유가 없습니다. 그것이 어떻게 작동하는지 알려주세요! – regulus6633

관련 문제