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

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

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

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

Microsoft Teams

Microsoft Teamsは、マイクロソフト社が提供しているMicrosoft365のコミュニケーションツール。Microsoft 365などで提供されています。チャットやビデオ会議の他、ファイルの共有やスケジュール管理などチームで活動する際に必要な機能が備わっています。

C#

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

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

1759閲覧

APIを使用せず、Teamsのチャットを自動取得する方法が分からない

locoJr.

総合スコア24

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

Microsoft Teams

Microsoft Teamsは、マイクロソフト社が提供しているMicrosoft365のコミュニケーションツール。Microsoft 365などで提供されています。チャットやビデオ会議の他、ファイルの共有やスケジュール管理などチームで活動する際に必要な機能が備わっています。

C#

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

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2022/10/12 17:32

前提

.NET 6でTeamsのチャットを自動取得する機能を開発中です。(下図の赤枠部)
イメージ説明

APIが使用できない環境下を想定し、P/InvokeやUI Automationでチャットの内容を取得しようとしているのですが、なかなか取得できません。

Inspect.exeで確認しましたが、ハンドルやクラスはアプリのウィンドウとその1つ下ぐらいまでしかなく、該当の部分はハンドルやクラス、AutomationIDは存在しない状況でした。(下図の赤枠部が取得したい例)
イメージ説明

どのようにすれば、チャット部分のUI要素が取得できるでしょうか。
ツリーをどんどん深くするようにしないといけないのでしょうか。
※UI AutomationやP/Invokeはあまり触ったことがありません。

実現したいこと

  • Teamsのチャットを取得できるようにする

試したこと

TeamsウィンドウやTeamsドキュメントはハンドルを持っているため、そのハンドルを使用しEnumChildWindowsを実施しても取得できませんでした。(ソースは消してしまいましたが、P/Invokeのまとまったページからコピペして実施しました)
UI Automationで、Teamsドキュメントのハンドルより取得したAutomationElementを使用し、その途中のAutomationIDを指定してもElementが取得できませんでした。

cs

1//P/Invoke 2[DllImport("user32.dll", SetLastError = true)] 3static extern IntPtr FindWindow(string lpClassName, string? lpWindowName); 4[DllImport("user32.dll", SetLastError = true)] 5public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr hWndChildAfter, string? className, string? windowTitle); 6 7//UI Automationの例 8IntPtr hWndTeamsLive = FindWindow("Chrome_WidgetWin_1", null); //Teamsウィンドウ 9IntPtr hWndTeamsDocument = FindWindowEx(hWndTeamsLive, IntPtr.Zero, "Chrome_RenderWidgetHostHWND", null); //Teamsドキュメント 10var elmTeamsDocument = AutomationElement.FromHandle(hWndTeamsDocument); //Teamsドキュメントのハンドルより、AutomationElementを取得 11var elm1 = mainForm.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.AutomationIdProperty, "message-pane-layout-a11y")); //ツリーの途中のAutomationID 12var elm2 = mainForm.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.AutomationIdProperty, "content-1665588609989")); //取得したい直前ぐらいのAutomationID 13//....

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022
.NET 6
C#

Microsoft Teams バージョン 1.5.00.21668 (64 ビット)
※無料版です。
M365のTeamsでは動作確認できていませんが、Inspect.exeで確認する限り、パッと見は同じようでした。

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

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

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

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

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

guest

回答1

0

自己解決

改めてSpy++で確認していたところ、同じclassが他にも存在しており、違うウインドウハンドルから取得しようとしていたことが分かりました。

EnumWindowsで列挙したうえでウインドウタイトルで絞り込んだところ、所望のテキストが取得できました。

投稿2022/10/13 18:58

locoJr.

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問