C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Edgeで開かれているタブを指定の条件で閉じる


(過去ログ 177 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■101896 / inTopicNo.1)  Edgeで開かれているタブを指定の条件で閉じる
  
□投稿者/ 新米SE (1回)-(2023/05/11(Thu) 17:10:21)

分類:[C#] 

開発環境はVisualstudio2019を使用しています。
C#はまだまだやり始めたばかりで、探り探り開発を行っています。

C#を使用して、Edgeで開かれているタブを指定の条件で閉じるということをしたいです。
条件として、
@Edgeで開かれているタブのURLを見て、指定した文字列を含む場合閉じる
A条件に合うタブが複数ある場合は、対象となるタブ全てを閉じる
ということが行いたいです。

ネットで探している中に、UIAutomationClientを使用して、開かれている最後のタブのURLを取得して、
最後のタブを閉じるというのがあり、参考にさせてもらったのですが、「最後のタブ」を参照するところを、
開かれているタブ全てにするという部分が分からない状態です。

以下が現在のソースコードになります。

using System;
using UIAutomationClient;

namespace MPBRCL
{
class Program
{
static void Main(string[] args)
{
// EdgeのアドレスバーのURL取得

int UIA_ControlTypePropertyId = 30003;
IUIAutomation uiAutomation = new CUIAutomation8();
IUIAutomationElement rootElement = uiAutomation.GetRootElement();
UIAutomationClient.IUIAutomationElement elmEdge;

string eURL = "";
{

int UIA_WindowControlTypeId = 50032;

IUIAutomationCondition condition =
uiAutomation.CreatePropertyCondition(
UIA_ControlTypePropertyId, UIA_WindowControlTypeId
);

UIAutomationClient.IUIAutomationElementArray aryWindowControls;
aryWindowControls = rootElement.FindAll(TreeScope.TreeScope_Subtree, condition);
elmEdge = null;
for (int i = 0; i < aryWindowControls.Length; i++)
{
string name = aryWindowControls.GetElement(i).CurrentName;
string classname = aryWindowControls.GetElement(i).CurrentClassName;
name = name.ToLower();

if (0 <= name.IndexOf("microsoft&#8203; edge"))
{
Console.WriteLine("name : " + name);

elmEdge = aryWindowControls.GetElement(i);
Console.WriteLine("elmEdge : " + elmEdge);

int UIA_EditControlTypeId = 50004;
IUIAutomationCondition condition2 =
uiAutomation.CreatePropertyCondition(
UIA_ControlTypePropertyId, UIA_EditControlTypeId
);
UIAutomationClient.IUIAutomationElementArray aryWindowControls2;
aryWindowControls2 = elmEdge.FindAll(TreeScope.TreeScope_Subtree, condition2);
for (int i2 = 0; i2 < aryWindowControls2.Length; i2++)
{
name = aryWindowControls2.GetElement(i2).CurrentName;
if (name == "アドレスと検索バー")
{
int UIA_ValueValuePropertyId = 30045;
eURL = (string)aryWindowControls2.GetElement(i2).GetCurrentPropertyValue(UIA_ValueValuePropertyId);
break;
}
}
break;
}
}
}


// Edgeの最後のタブを閉じる
int last_iptn = -1;
if (elmEdge != null)
{
int UIA_ButtonControlTypeId = 50000;
IUIAutomationCondition condition3 =
uiAutomation.CreatePropertyCondition(
UIA_ControlTypePropertyId, UIA_ButtonControlTypeId
);

UIAutomationClient.IUIAutomationElementArray aryWindowControls3;
aryWindowControls3 = elmEdge.FindAll(TreeScope.TreeScope_Subtree, condition3);

for (int i3 = 0; i3 < aryWindowControls3.Length; i3++)
{
string name = aryWindowControls3.GetElement(i3).CurrentName;
Console.WriteLine("name : " + name);
if (name == "タブを閉じる")
{
last_iptn = i3;
}
}

if (last_iptn != -1)
{
IUIAutomationInvokePattern iptn;
int UIA_InvokePatternId = 10000;
iptn = (IUIAutomationInvokePattern)aryWindowControls3.GetElement(last_iptn).GetCurrentPattern(UIA_InvokePatternId);
iptn.Invoke();
}
}
}
}
}

以上です。
ご教授いただけたらと思います。
引用返信 編集キー/
■101902 / inTopicNo.2)  Re[1]: Edgeで開かれているタブを指定の条件で閉じる
□投稿者/ 魔界の仮面弁士 (3634回)-(2023/05/12(Fri) 11:30:51)
No101896 (新米SE さん) に返信
> C#を使用して、Edgeで開かれているタブを指定の条件で閉じるということをしたいです。
.NET Managed な UIAutomationClient ではなく、
COM Interop な UIAutomationClient を採用しているのですよね。


> Edgeで開かれているタブのURLを見て、指定した文字列を含む場合閉じる

・それぞれのタブに切り替えないと、URL を拾えません。
・タブを右クリックして「グループ」化されている可能性がある点にも注意しましょう。
 折りたたまれているグループの場合、グループを展開する必要があります。
・「ピン留めされたタブ」の場合、"タブを閉じる" ボタンがありません。
 ピン留めされているものも閉じたい場合は、コンテキストメニューを呼び出してください。


> IUIAutomationCondition condition3 =
>   uiAutomation.CreatePropertyCondition(
>     UIA_ControlTypePropertyId, UIA_ButtonControlTypeId
>   );
子孫探索を And 条件にして、「ButtonControl な要素」だけでなく、
「Name が "タブを閉じる" な要素」という条件も同時に指定した方が手っ取り早いかと。

あるいはタブのタイトルとかまで拾いたい場合は、
親階層(TabContainerImpl)から列挙するようにしてみてください。


> for (int i3 = 0; i3 < aryWindowControls3.Length; i3++)
> {
>   string name = aryWindowControls3.GetElement(i3).CurrentName;
>   Console.WriteLine("name : " + name);
>   if (name == "タブを閉じる")
>   {
>     last_iptn = i3;
>   }
> }
先頭からすべてを列挙して last_iptn を更新し続けるぐらいなら、
末尾から先頭に向かってループしたほう手っ取り早いかと思いますよ。

TabItemControl の中には、"タブを閉じる" ボタンだけでなく、
"タブのミュート" ボタンなども同時に出現する可能性がありますが、
"タブを閉じる" の方が後ろにあるので、break; で脱出しやすいです。


> 「最後のタブ」を参照するところを、
> 開かれているタブ全てにするという部分が分からない状態です。
『if (name == "タブを閉じる")』に合致するすべての UIA_ButtonControlTypeId を対象にすれば良いと思います。
引用返信 編集キー/
■101904 / inTopicNo.3)  Re[2]: Edgeで開かれているタブを指定の条件で閉じる
□投稿者/ 魔界の仮面弁士 (3635回)-(2023/05/12(Fri) 14:06:13)
No101902 (魔界の仮面弁士) に追記
> > Edgeで開かれているタブのURLを見て、指定した文字列を含む場合閉じる
> ・それぞれのタブに切り替えないと、URL を拾えません。
> ・タブを右クリックして「グループ」化されている可能性がある点にも注意しましょう。
>  折りたたまれているグループの場合、グループを展開する必要があります。
> ・「ピン留めされたタブ」の場合、"タブを閉じる" ボタンがありません。
>  ピン留めされているものも閉じたい場合は、コンテキストメニューを呼び出してください。

サンプルを書いてみました。

「指定した文字列を含む場合閉じる」のではなく、
タブごとに閉じるかどうかを問い合わせる実装になっています。
※タブグループは考慮していません。
https://gist.github.com/Benshi/e6cca7a15bac7eef12d1e888e55988ca
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -