掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
UIAutomationのInvokeを使いボタンをクリックした際に入力待機になるのを防ぎたい (ID:151311)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Delphi11 VCLでUIAutomationを使った機能を開発しております。 とあるアプリケーションにダイアログを開くボタンがあります。 このボタンをUIAutomationのInvokeでクリックすると、ダイアログが開くのですが ダイアログを閉じるまで入力待機状態になってしまい処理が停止してしまいます。 Invokeの先でこのようにダイアログを開くような場合は入力待機になるのがUIAutomationの仕様のようですが、 ここをうまく切り抜けてこの開いたダイアログに対して、手入力なしで続けてUIAutomationでアクセスしたいのですが 現状、うまくいきません。 まず行ったのは以下のようなソースです。 var UIAElem: IUIAutomationElement; Interf: IInterface; InvokePtn: IUIAutomationInvokePattern; //////////////////////////////////////////////////// //UIAElemにはボタンのIUIAutomationElementが設定されています UIAElem.GetCurrentPattern(UIA_InvokePatternId,Interf); if Assigned(Interf) then begin if Interf.QueryInterface(IID_IUIAutomationInvokePattern,InvokePtn) = S_OK then begin InvokePtn.Invoke; <--ここで入力待機状態になりダイアログを閉じるまで停止 end; end; これだとInvokeでダイアログが開いた状態で入力待機なりました。 次に、別スレッドでInvokeを実行してみました。 var ThreadInv: TThread; //////////////////////////////////////////////////// //UIAElemにはボタンのIUIAutomationElementが設定されています UIAElem.GetCurrentPattern(UIA_InvokePatternId,Interf); if Assigned(Interf) then begin if Interf.QueryInterface(IID_IUIAutomationInvokePattern,InvokePtn) = S_OK then begin //別スレッドで実行 ThreadInv := TThread.CreateAnonymousThread( procedure() begin InvokePtn.Invoke; end); ThreadInv.FreeOnTerminate := False; ThreadInv.Start; end; end; Invokeで停止はしなくなりましたが、入力待機状態でビジーなのか、その状態でUIAutomationを使ったアクセス (UIAutomationのElementFromPointでマウス下のコントロールを取得)をそのボタンがあるWindow向けに行うと アクセス違反が発生するようになりました。 Invokeのスレッド実行後に強引に TerminateThread(ThreadInv.Handle, 0); といった事を行ってみましたが入力待機は続いているようで事象解消の効果は無く・・・ キレイにInvokeを抜けるにはどうしたら良いのでしょうか? どなたかお助けくださいませ。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.