前提・実現したいこと
IEの特定のタブを閉じたい
Edge用のプログラムで実現していることを、IEでも同様に行いたいと考えております。
発生している問題・エラーメッセージ
以下の質問に対する回答に示されているコードを実行すると、
Edgeの特定のタブを閉じることが出来ました。
「Edgeの特定のタブを閉じたいです。」
https://teratail.com/questions/89517
同じようにIEでも特定のタブを閉じる処理を行いたいと考えていますが、
以下の部分でIEを参照することができません。
該当のソースコード
C#
1 IUIAutomationElement core_window = null; 2 { 3 const int UIA_ClassNamePropertyId = 30012; 4 var cond = automation.CreatePropertyCondition( 5 UIA_ClassNamePropertyId, "Windows.UI.Core.CoreWindow"); 6 core_window = edge.FindFirst(TreeScope.TreeScope_Children, cond); 7 } 8 if (core_window == null) 9 { 10 return; 11 }
C#
1using System; 2using UIAutomationClient; 3 4namespace ConsoleApp1 5{ 6 class Program 7 { 8 [STAThread] 9 static void Main(string[] args) 10 { 11 //タブの名前 12 string target_title = "新しいタブ"; 13 14 target_title += " タブ";//後ろに必ず付いているようなので足す 15 16 string CLSID_CUIAutomation = "ff48dba4-60ef-4201-aa87-54103eef594e"; 17 Type type = Type.GetTypeFromCLSID(Guid.Parse(CLSID_CUIAutomation)); 18 IUIAutomation automation = Activator.CreateInstance(type) as IUIAutomation; 19 20 IUIAutomationElement root = automation.GetRootElement(); 21 IUIAutomationTreeWalker walker = automation.RawViewWalker; 22 23 IUIAutomationElement edge = null; 24 edge = walker.GetFirstChildElement(root); 25 while (edge != null) 26 { 27 string name = edge.CurrentName; 28 //if(!string.IsNullOrEmpty(name) && name .EndsWith(" - Microsoft Edge")) 29 if(!string.IsNullOrEmpty(name) && name .EndsWith(" - Internet Explorer")) 30 { 31 break; 32 } 33 IUIAutomationElement next= walker.GetNextSiblingElement(edge); 34 edge = next; 35 } 36 if (edge == null) 37 { 38 return; 39 } 40 41 IUIAutomationElement core_window = null; 42 { 43 const int UIA_ClassNamePropertyId = 30012; 44 var cond = automation.CreatePropertyCondition( 45 UIA_ClassNamePropertyId, "Windows.UI.Core.CoreWindow"); 46 core_window = edge.FindFirst(TreeScope.TreeScope_Children, cond); 47 } 48 if(core_window == null) 49 { 50 return; 51 } 52 53 Console.WriteLine(core_window.CurrentName); 54 55 IUIAutomationElement TabsList = null; 56 TabsList = walker.GetFirstChildElement(core_window); 57 while (TabsList != null) 58 { 59 string id = TabsList.CurrentAutomationId; 60 if (!string.IsNullOrEmpty(id) && id == "TabsList") 61 { 62 break; 63 } 64 IUIAutomationElement next = walker.GetNextSiblingElement(TabsList); 65 TabsList = next; 66 } 67 68 if(TabsList == null) 69 { 70 return; 71 } 72 Console.WriteLine(TabsList.CurrentClassName); 73 74 IUIAutomationElement target_tab = null; 75 target_tab = walker.GetFirstChildElement(TabsList); 76 while (target_tab != null) 77 { 78 string name = target_tab.CurrentName; 79 if (!string.IsNullOrEmpty(name) && name == target_title) 80 { 81 break; 82 } 83 IUIAutomationElement next = walker.GetNextSiblingElement(target_tab); 84 target_tab = next; 85 } 86 if(target_tab == null) 87 { 88 return; 89 } 90 91 //タブを選択する操作をする 92 IUIAutomationSelectionItemPattern select_pattern = null; 93 const int UIA_SelectionItemPatternId = 10010; 94 select_pattern = target_tab.GetCurrentPattern(UIA_SelectionItemPatternId); 95 if(select_pattern == null) 96 { 97 return; 98 } 99 select_pattern.Select(); 100 //適当に待つ 101 System.Threading.Thread.Sleep(1000); 102 IUIAutomationElement m_tabItemRoot = null; 103 m_tabItemRoot = walker.GetFirstChildElement(target_tab); 104 if(m_tabItemRoot == null) 105 { 106 return; 107 } 108 109 //閉じるボタンを探す 110 IUIAutomationElement AllInputCloseButton = null; 111 AllInputCloseButton = walker.GetFirstChildElement(m_tabItemRoot); 112 while (AllInputCloseButton != null) 113 { 114 string id = AllInputCloseButton.CurrentAutomationId; 115 if (!string.IsNullOrEmpty(id) && id == "AllInputCloseButton") 116 { 117 break; 118 } 119 IUIAutomationElement next = walker.GetNextSiblingElement(AllInputCloseButton); 120 AllInputCloseButton = next; 121 } 122 if(AllInputCloseButton == null) 123 { 124 return; 125 } 126 127 //ボタンを押す 128 const int UIA_InvokePatternId = 10000; 129 IUIAutomationInvokePattern invoke_pattern = null; 130 invoke_pattern = AllInputCloseButton.GetCurrentPattern(UIA_InvokePatternId); 131 if(invoke_pattern == null) 132 { 133 return; 134 } 135 invoke_pattern.Invoke(); 136 137 Console.ReadKey(); 138 } 139 140 } 141}
試したこと
classnameを「Windows.UI.Core.CoreWindow」以外で指定してみました。
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2019
.Net Core 3.1
どうか解決方法をご存じの方、教えてください。
あなたの回答
tips
プレビュー