質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

18464閲覧

Edgeの特定のタブを閉じたいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/08/23 14:38

こんにちは。
Windows10でC#のアプリケーションを開発しています。
Visual Studio 2017 Communityを使っています。

###前提・実現したいこと
Edgeの特定のタブを閉じたいです。

###該当のソースコード

C#

1private void CloseEdgeTab(string title) 2{ 3 var process = System.Diagnostics.Process.GetProcesses().Where(p => p.MainWindowTitle.Contains(title)).FirstOrDefault(); 4 process.CloseMainWindow(); 5}

と書いて、Edgeのウィンドウを閉じようとしています。

###発生している問題・エラーメッセージ
これで閉じることは閉じれるのですが、タブではなくEdgeのウィンドウをすべて閉じてしまいます。
特定のタブのみを閉じるには、どのようにしたらよいでしょうか?
タスクマネージャーでは、Edgeは複数のプロセスにわかれているように見えるのですが、タブごとに、べつべつに閉じることはできませんか?

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

何が最終的な目的か知りませんがXAMLで作成されたアプリケーションはUIAutomationで操作します。
EdgeのHTML内の自動操作をしたいのであれば、WebDriverを検討してください。

UI Automationのドキュメントを見てください。
また、Windows SDKをインストールしてinspectというツールを使ってみてください。
これはUIAutomationによる情報の取得と操作を試すことが出来ます。
最新のSDKをインストールすれば
C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64
にあります。
Inepectを起動して左側のツリーからエレメントを選び、メニューのActionから行いたい操作を選択します。
なお、左上のドロップボックスでUIAutomationとMSAAを切り替えられますが、UIAutomationを使ってください。

以下はInepectを使用してEdgeを調べ、タブの閉じるボタンを押すところまで実施したサンプルです。
(コピペのロジックが多いです)

COMの設定は以下と同じ
https://teratail.com/questions/88664

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 { 30 break; 31 } 32 IUIAutomationElement next= walker.GetNextSiblingElement(edge); 33 edge = next; 34 } 35 if (edge == null) 36 { 37 return; 38 } 39 40 IUIAutomationElement core_window = null; 41 { 42 const int UIA_ClassNamePropertyId = 30012; 43 var cond = automation.CreatePropertyCondition( 44 UIA_ClassNamePropertyId, "Windows.UI.Core.CoreWindow"); 45 core_window = edge.FindFirst(TreeScope.TreeScope_Children, cond); 46 } 47 if(core_window == null) 48 { 49 return; 50 } 51 52 Console.WriteLine(core_window.CurrentName); 53 54 IUIAutomationElement TabsList = null; 55 TabsList = walker.GetFirstChildElement(core_window); 56 while (TabsList != null) 57 { 58 string id = TabsList.CurrentAutomationId; 59 if (!string.IsNullOrEmpty(id) && id == "TabsList") 60 { 61 break; 62 } 63 IUIAutomationElement next = walker.GetNextSiblingElement(TabsList); 64 TabsList = next; 65 } 66 67 if(TabsList == null) 68 { 69 return; 70 } 71 Console.WriteLine(TabsList.CurrentClassName); 72 73 IUIAutomationElement target_tab = null; 74 target_tab = walker.GetFirstChildElement(TabsList); 75 while (target_tab != null) 76 { 77 string name = target_tab.CurrentName; 78 if (!string.IsNullOrEmpty(name) && name == target_title) 79 { 80 break; 81 } 82 IUIAutomationElement next = walker.GetNextSiblingElement(target_tab); 83 target_tab = next; 84 } 85 if(target_tab == null) 86 { 87 return; 88 } 89 90 //タブを選択する操作をする 91 IUIAutomationSelectionItemPattern select_pattern = null; 92 const int UIA_SelectionItemPatternId = 10010; 93 select_pattern = target_tab.GetCurrentPattern(UIA_SelectionItemPatternId); 94 if(select_pattern == null) 95 { 96 return; 97 } 98 select_pattern.Select(); 99 //適当に待つ 100 System.Threading.Thread.Sleep(1000); 101 IUIAutomationElement m_tabItemRoot = null; 102 m_tabItemRoot = walker.GetFirstChildElement(target_tab); 103 if(m_tabItemRoot == null) 104 { 105 return; 106 } 107 108 //閉じるボタンを探す 109 IUIAutomationElement AllInputCloseButton = null; 110 AllInputCloseButton = walker.GetFirstChildElement(m_tabItemRoot); 111 while (AllInputCloseButton != null) 112 { 113 string id = AllInputCloseButton.CurrentAutomationId; 114 if (!string.IsNullOrEmpty(id) && id == "AllInputCloseButton") 115 { 116 break; 117 } 118 IUIAutomationElement next = walker.GetNextSiblingElement(AllInputCloseButton); 119 AllInputCloseButton = next; 120 } 121 if(AllInputCloseButton == null) 122 { 123 return; 124 } 125 126 //ボタンを押す 127 const int UIA_InvokePatternId = 10000; 128 IUIAutomationInvokePattern invoke_pattern = null; 129 invoke_pattern = AllInputCloseButton.GetCurrentPattern(UIA_InvokePatternId); 130 if(invoke_pattern == null) 131 { 132 return; 133 } 134 invoke_pattern.Invoke(); 135 136 Console.ReadKey(); 137 } 138 139 } 140} 141

投稿2017/08/24 12:40

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/08/25 08:05 編集

ありがとうございます。 試したところ、タブを終了できました。感謝します。 ツールのご案内もありがとうございます。 早速Inspectを使ってみました。細かくウィンドウやボタンの情報をとれて、強力そうです。 ときどき目的を尋ねられるのですが、最終的な目的はひとことで説明するのは、とてもむずかしいです。
guest

0

私のほうでも試してみましたが、結論から言うと難しいだと思います。

######まず参考URL
How to open “Microsoft Edge” from c# and wait for it to be closed?
プロセスを強制的に終了する
他のプログラムのメインウィンドウを閉じて終了する

######でサンプルコード

C#

1 foreach (var process in Process.GetProcesses().Where(p => p.ProcessName == "MicrosoftEdgeCP")) 2 { 3 Console.WriteLine(process.HasExited); 4 if (!process.CloseMainWindow()) 5 { 6 process.Kill(); 7 } 8 Console.WriteLine(process.HasExited); 9 Console.WriteLine(process.CloseMainWindow()); 10 process.Dispose(); 11 }

これをローカルで動かすと、たまーにタブが閉じられますが、基本的にはプロセスが殺された後ですぐに復活し、開いていたページを再読み込みするようです。

プロセス名として指定したMicrosoftEdgeCPがタブのプロセスらしいですが、ほかにMicrosoftEdgeってやつもいて、こいつがメインプロセスとしてタブたちの管理や死活制御を行なっているように見えます。
当然このメインプロセスを殺すとEdgeごとサヨナラします。

また別の試行としてタスクマネージャの右クリックから閉じるのも、上記動作と同じように一瞬タブが死んだように見えた後再読み込みする動きでした。

ということでいかがでしょうか。

投稿2017/08/24 09:45

編集2017/08/24 09:46
ShikaTech

総合スコア468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/08/24 12:34

検証ありがとうございます。なるほど。プロセスにEdgeCPというのがあるのは気づいたのですが、それがタブだったんですね。で、それは消せないと…。なるほど。ありそうな感じですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問