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

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

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

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

7回答

1759閲覧

win10プログラムで実行されるWin画面の一部文字情報をpowershellで読み込みたい

7of9

総合スコア12

C#

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

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2019/06/14 22:25

前提・実現したいこと

「win10プログラムで実行されるWin画面の一部文字情報をpowershellで読み込みたい」

win10プログラムをPowershellで起動します。そこで画面表示される内容の一部をPowershellで読み取り
それを変数代入したいのです。具体的には、1つか2つのIp-Addressを読み取りたいのですが、これは起動毎に異なります。
現在は、手動でそのwin10プログラムを起動し、人間の目でIP-Addressを確認、続いて別プログラムへ手動入力しています。いわばその自動化が目的です。
文字情報と主題に書きましたが、後のプログラムでは、ip-addressの値として取り扱います。
又、残念ながら、そのIP-Address情報は、その画面で目視取得するしか術はなく、何かのFileに残っていたり、Registry内で取得することができない、との結論に至っています。

無論、のwin10プログラムは、実際には画面表示させる必要もなく、見えない状態か、最小化のまま実行でも差し支えありません。

pwershellにはこだわってはいませんが、まずはpowershellで、続いてpython,C#などでの手段もできれば知りたいと考えています。

全くの初投稿です、何卒ご教授よろしくお願いします,質問構文や作法に間違い・失礼がありましたらご容赦下さい。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)てください。

hayataka2049👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/06/14 23:15

そのアプリは外部と IP アドレスで接続して通信を行っていて、その IP アドレスを取得したいということですか? であれば、プロキシ的なものを作って間に入れて、そこで取得すると言うのはどうでしょう? 思い付きに過ぎないので、全く外れでしたらすみません。
7of9

2019/06/14 23:58 編集

SurferOnWwwさん、お言葉ありがとうございます。そのアプリの起動毎にあるロジックで、Poolされているアドレスレンジから1つか2つのアドレスを抽出するというものです。DHCPサーバーに似ています。 実際にそのアドレスに向けて通信するかは別の判断となり、Proxyなりの中間で読み取る仕組みは採用できないのです。ハンドル取得はできますが、人間の目でみて、とか人間がそのWin画面内全部のテキストをマウスでコピーする、そのようなスクリプトかプログラムを目指しています。 UIAutomation関係を読んでいますが、少々古いというか提供中止の様子。RPA方向でUIPathで済みそうですが、なんというか大きな仕組みに頼りすぎな感があり、なおも何かのプログラミング手段を模索しています。ありがとうございます!
退会済みユーザー

退会済みユーザー

2019/06/15 03:34

了解しました。ご丁寧な返答をありがとうございました。
guest

回答7

0

UIAutomation 方面からのアプローチの例です。

PowerShell からだと、一部処理がうまく出来ないという話がありますが、表示情報程度なら行けることが多いので、まず取得できるかどうかの確認として。

PowerShellのUIAutomationは複雑怪奇なり - Qiita

powershell

1# 名前空間の省略 2using namespace System.Windows.Automation 3# UIAutomation関連のアセンブリロード 4Add-Type -AssemblyName UIAutomationClient, UIAutomationTypes 5 6# エラー時強制停止 7$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Stop 8 9Set-StrictMode -Version Latest 10 11[string]$processName = 'EXCEL' 12 13# UI要素から適当に情報を抜き出す関数 14function Show-UIAElementInfo { 15 param( 16 [parameter(ValueFromPipeline=$true)] 17 [AutomationElement[]]$InputObject 18 ) 19 process { 20 $InputObject | 21 ForEach-Object -MemberName Current | 22 Select-Object -Property Name, LocalizedControlType, ClassName 23 } 24} 25 26 27# $processName のプロセスIDの検索条件(同時起動が1プロセスであること前提の書き方) 28[Condition]$PIDCond = 29 Get-Process -Name $processName -ErrorAction Stop | 30 ForEach-Object -Process { 31 [PropertyCondition]::new( 32 [AutomationElement]::ProcessIdProperty, 33 $_.Id 34 ) 35 } 36 37# プロセスIDに該当するものをルート直下から検索(基本的にはウィンドウ相当の一覧) 38[AutomationElementCollection]$procUIAWindows = 39 [AutomationElement]::RootElement.FindAll( 40 [TreeScope]::Children, 41 $PIDCond 42 ) 43 44 45# 表示されている情報はNameプロパティとなっていることが多い 46[Condition]$contentAndNotNullNameCond = [AndCondition]::new(@( 47 [Automation]::ContentViewCondition 48 [NotCondition]::new( 49 [PropertyCondition]::new( 50 [AutomationElement]::NameProperty, 51 [string]::Empty 52 ) 53 ) 54)) 55 56$procUIAWindows | 57 ForEach-Object -Process { 58 $_.FindAll( 59 [TreeScope]::Descendants <#自身より下の階層#> , 60 $contentAndNotNullNameCond 61 ) 62 } | 63 Show-UIAElementInfo

投稿2019/06/15 07:10

imihito

総合スコア2166

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

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

yumetodo

2019/06/15 09:47

ああ、そうか。アセンブリを読み込んで型書きまくればやれんこともないのか(素直にC#で書きたいです
imihito

2019/06/15 10:38

自分も素のPowerShellではあまり書きたくはないですね…… C#に対応したエディタを使えない環境でやるときも、オレオレラッパー関数経由でやることが多いです。
7of9

2019/06/15 23:56 編集

UiPathにはGet Visible Text、Get Full Textという”アクティビティ”というお作法があるようです。全くの門外漢ですが、それほど大袈裟にしたくないという気もあります。八方ふさがりならここ追及してみます。 https://forum.uipath.com/t/difference-between-get-text-and-get-full-text/63477/3 試用版ではなく、本当に無料使用できる手段もあるんですね、、、あ、宣伝マンではないです。 Powershellだと限界ありそうですが、C#も不案内な当方、C以来でほぼ30年ぶりなのでexe作るのにハードル高そうです。Win10アプリのハンドルは取れますし、表示位置も決まっています、なのでコントロール値を二つ取得して、これで方向はあっているのかな、、もう少しな感じですが、カメの遅さで調べています。ご興味、ご指導いただきありがとうございます。
7of9

2019/06/15 23:56

”exe作るのにハードル高そうです。” >>自己レスですが、考えすぎていました。環境用意してISEで、、ではなく、フツーに.csをコンパイルすればいいと判りました。DOS時代のlink&Compile,,全く同じでした。(笑;お騒がせを)
7of9

2019/06/16 00:03

UIAutomationも勉強してみます、????
guest

0

teratailのserver error表示があり、自己レスコメントが二度postされていました。原因は判りません、一度クリックしただけです。yumetodoさん、1つを編集して見やすくしてみました。

投稿2019/06/19 13:53

編集2019/06/20 22:10
7of9

総合スコア12

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

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

7of9

2019/06/20 22:12

「yumetodoさん、1つを編集して見やすくしてみました。」との投稿をしましたが、余計にpostが増える結果になってしまいました、、、触らないようにします。yumetodoさん、大変申し訳ありません。
guest

0

自己レスです。
結局、autoitの WinGetTextで取得できました。対象のWindow内の全部のテキストをしてしまいますので、あとは文字列操作で、対象のip address抽出できそうです。

https://www.autoitscript.com/autoit3/docs/functions/WinGetText.htm

Autoitコマンドレットありましたが、Textの書き込みができても読み取るはありませんでした。そこでPowershellをあきらめ、WinGetTextを発見。.exeに簡易に変換できるので、結果オーライ。
Autoit 無料で好感ですが、1年以上更新ないのはなぜかな、、、?!
はやりものなのでUIPathも興味ありましたが、何となく大がかりに見えます(全く触っていませんが)。
一息ついたら、勉強します。
コメント頂きました諸兄、深謝いたします。

投稿2019/06/19 13:31

7of9

総合スコア12

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

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

0

自己レスです。結局、autoitの WinGetTextで取得できました。対象のWindow内の全部のテキストをしてしまいますので、あとは文字列操作で、対象のip address抽出できそうです。

Autoitコマンドレットありましたが、Textの書き込みができても読み取るはありませんでした。そこでPowershellをあきらめ、WinGetTextを発見。.exeに簡易に変換できるので、結果オーライ。
Autoit 無料で好感ですが、1年以上更新ないのはなぜかな、、、?!

はやりものなのでUIPathも興味ありましたが、何となく大がかりに見えます(全く触っていませんが)。
一息ついたら、勉強します。

コメント頂きました諸兄、深謝いたします。

投稿2019/06/19 13:26

7of9

総合スコア12

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

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

0

自己解決

自己レスです。
AutoitのPowershell commandletが惜しくも、書き込みだけで読み込みするものがなく、あきらめ。
しかし、Powershellにこだわらなければ、結局、autoitの WinGetTextで取得できました。
.exeにもすぐに変換できて、これに落ち着きそうです。

https://www.autoitscript.com/autoit3/docs/functions/WinGetText.htm

コメント頂いた諸兄、深謝です。

投稿2019/06/19 13:11

編集2019/06/19 13:52
7of9

総合スコア12

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

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

yumetodo

2019/06/20 10:58

大量に自己レスがあるのは一体・・・?
7of9

2019/06/20 22:13

yumetodoさん、余計にみずらくなってしまいました、スミマセン。
yumetodo

2019/06/21 01:34

サーバーエラーなら仕方ない
guest

0

y_waiwaiさんのアプローチがだめな場合は、そのWindowをキャプチャして画像として読み取り、切り抜いてOCRするという手法もあります。いずれにせよC#なりC++で書くことになりますが。

投稿2019/06/15 04:47

yumetodo

総合スコア5850

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

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

7of9

2019/06/15 23:57 編集

yumetodoさん、お言葉ありがとうございます。OCR説ですね、昨今は読み取り精度が高いので、可能性ありそうです。まずは、どなたかのCodeを探してみます。
yumetodo

2019/06/15 09:45

フォントが決まっていればパターンマッチングのほうが精度が出る気もします(数値だけなら処理も軽い)
guest

0

PowerShellだけではおそらく手間がかかりすぎるとか無理でしょうから、C#とかでコードを組むとか他のツールを導入するとかしないといけないでしょう
「他アプリのコントロール」あたりでぐぐるといろいろ出てきますんで読んでみればどうでしょう。

投稿2019/06/14 22:37

y_waiwai

総合スコア87774

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

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

7of9

2019/06/14 22:40

y_waiwaiさん、早速ありがとうございます。ズバリなコマンドレットなどもなく、難儀していました。 他アプリのコントロール、、検索してみます。RPA的な少し大掛かりな方向になりそうなのですね。
y_waiwai

2019/06/14 22:43

実際に値が取れるかどうかというのは、その他アプリの作りに依存するのでやってみないとわからないってところはあります まあ、ぐぐってみると、他アプリからの値を取得するツールみたいなのがあるみたいなんで、とりあえずはそんなのを使ってみるといいかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問