2011-07-27 9 views
0

これで、私のために音声コントロールを行うためのapplescriptを書いています。Applescriptは入力後自動的にダイアログボックスを閉じますか?

私は声のコントロールのためにMac用のDragon Dictate 2.0を使用していますが、主に自分のコーディングのためにリンスクリプトを使用しています。私は一度小さな問題を除いて、すべてかなり平方している。私はボイスコマンドを期待して、指示するテキストのためにダイアログを表示しています。

例えば、

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

これは私の問題は、私は追加のフレーズを話すことなく、[OK]を押すことができる方法である「キャンセル」と「OK」

を空のテキストフィールドを持つダイアログボックス、およびボタンが表示されます。 現在、私は "go"を話すのを聞く音声コマンドを持っていて、 "return"キーを押しているAppleScriptを実行しています。これは機能しますが、私は "行く"と言う必要はありません。

は私が自動的にダイアログボックスを閉じ、一定期間後の入力を受け付けるように

giving up after 10 

を追加することができます知っているが、より良い方法がなければなりません。

私はいくつかの調査を行い、リターンキーストロークを実行するための「完了した編集」のイベントハンドラを持つことができることを発見しました。しかし、私はこれをどうやって行うのか分かりません。誰かが偉大な入力やアイデアを持っている場合。ありがとう!

+0

どうすればいいですか?ディクテーションがコマンドウィンドウに表示されているときは、無効になっているので、私はスピーチのテキストを取得することはできません。私はドラゴンディクテーションを使用しないのでそれですか? – Grigor

+0

可能であれば、私はこれのコードを見ることができれば本当に素晴らしいでしょう。 – Grigor

答えて

0

"on done editing"が最善の方法ですが、objective-cまたはAppleScriptObjCを使用してXcodeにダイアログボックスを作成する必要があります。それはあなたの能力を超えているようです。

あなたの能力の中にあるものは、あなた自身の "編集済みのもの"メソッドをシミュレートすることができます。ダイアログボックスを表示する最初のアプリスクリプトが実行されると、2回目のアプリスクリプトが起動する可能性があります。この2番目のAppleScriptは、ダイアログボックスのテキストフィールドを定期的にチェックすることができます。テキストが一定の時間変化しなくなると、リターンキーを押すことができます。 2番目のリンスクリプトからダイアログボックスをどのようにターゲットするかを考えなければならないので少し複雑ですが、あまり難しくありません。ダイアログボックスにタイトルを付け、システムイベントを使用してそのタイトルのウィンドウを見つけるのが最善の方法です。

別のアプリケーションでこれを行う必要がある理由は、通常のAppleScriptはダイアログボックスが開いている間にすべてのコマンドを一時停止するためです。したがって、テキストフィールドをチェックするために別のプロセスを実行する必要があり、2番目のスクリプトが最も簡単な方法です。

EDIT:これは、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

もう1つの問題は、一度ダイアログボックスが表示されることです。バックグラウンドで現在実行されている他のすべてのスクリプトは、ダイアログボックスが閉じられるまで一時停止します。 – tknickman

+0

私は説明したように、私は上記の解答を解答した。あなたはobjective-cを使いたくないのは、あなたにとって複雑すぎるからです。 objective-cを学ぶだけでなく、インターフェース・ビルダーを使用してダイアログ・ウィンドウを作成する方法も学ぶ必要があります。なぜなら、AppleScriptはうまく動作するからです。どのように動作するか教えてください! – regulus6633

関連する問題