

タイトルの件、既存のWindows Formアプリを変更を加えず、外部プロセスから  
Windows FormアプリのDataGridViewの任意のセルにアクセス（入力と出来れば読み込み）する方法を調査中です。

環境は、OSは、Windows10 、.NETは4.5.2互換（以上）です。

Windows Messageを利用すると、TextBoxやButtonにアクセスできることは、  
確認できました。（以下のようにSendMessageを利用。）

[code]

    [DllImport("user32.dll", SetLastError = true)]
        public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
    
[/code]

ただ、DataGridViewへの任意のセルへのアクセス方法がわかっておりません。  
このあたりノウハウのある方がおりましたら、アクセスの可否を含めご教示頂きたく、  
よろしくお願い致します。


CC BY-SA 4.0
2019-04-04T09:42:18.763
53917
2019-04-18T21:54:51.433
2019-04-04T22:55:01.423
9228
9228
question
c# winforms
C# Windows Formアプリの部品DataGridViewに外部プロセスからアクセスしたい


「UWSC」というWinsowsの操作を自動化するソフトで出来たようです。  
ただし現在作者とは連絡が取れず、サイトも崩壊状態のようです。

[CSWU～どうする UWSCなしの互換システム](https://wiki3.jp/CSWU)  
[UWSC辞典](http://uwsc.s1007.xrea.com/)

[GETSTR | UWSC辞典](http://uwsc.s1007.xrea.com/script/function/getstr/)

> UString = GETSTR( ID, [番号, 種別, マウス移動] )  
>  種別  
>  STR_ACC_CELL (5)  
>  DataGridView内のCell値を取得

[SENDSTR | UWSC辞典](http://uwsc.s1007.xrea.com/script/function/sendstr/)

> SENDSTR( ID, 文字列, [番号, 送信モード, ACC指定] )  
>  ACC指定  
>  STR_ACC_CELL (5)  
>  DataGridView内のCell値の変更

* * *

英語版に同様の記事があり、解決マークは無いが、懸賞ポイントの付いた回答があります。  
[Getting full contents of a Datagrid using
UIAutomation](https://stackoverflow.com/q/12129592/9014308)  
[UI Automation not working for
DataGridView](https://stackoverflow.com/q/19511546/9014308)  
[懸賞ポイントの付いた回答](https://stackoverflow.com/a/19601281/9014308)  
上記の参考サイト [WPF UI Automation](https://www.codeproject.com/Articles/33049/WPF-
UI-Automation) / [TreeScope Enum](https://docs.microsoft.com/en-
us/dotnet/api/system.windows.automation.treescope?redirectedfrom=MSDN&view=netframework-4.7.2)

更に類似の記事ですが、こちらは UWSC と同様の AutoIt というソフトを使う方法になっています。  
ただし、こちらも解決マークは付いていません。  
[C# - Read datagridview of some
application](https://stackoverflow.com/q/39530821/9014308)

* * *

DataGridView の前身である DataGrid ならば、UI Automation
という機能を使ってアクセスできるようですが、DataGridView は直接はサポートされていないようです。  
上記英語版の回答は、どちらもなにがしかの工夫で出来るようになっていると書いているようです。  
[UI オートメーションによる DataGrid コントロール型のサポート](https://docs.microsoft.com/ja-
jp/dotnet/framework/ui-automation/ui-automation-support-for-the-datagrid-
control-type) と [UI オートメーションによる DataItem
コントロール型のサポート](https://docs.microsoft.com/ja-jp/dotnet/framework/ui-
automation/ui-automation-support-for-the-dataitem-control-type)
を組み合わせるのかもしれません。

* * *

**追記**  
古いPythonの記事ですが、こんなのがあって、対話的に使えるツールの紹介がありました。  
[PythonでUI
Automation](https://qiita.com/totutiteta/items/3ab6073030cd415edaad) /
[PythonでUI Automation Part
2](https://qiita.com/totutiteta/items/a31083121b1707c062d6)  
[AutomationElementの調べ方](https://qiita.com/totutiteta/items/a31083121b1707c062d6#automationelement%E3%81%AE%E8%AA%BF%E3%81%B9%E6%96%B9)

[Inspect](https://docs.microsoft.com/en-us/windows/desktop/WinAuto/inspect-
objects)  
[Visual UI Automation Verify](https://docs.microsoft.com/en-
us/windows/desktop/WinAuto/visual-ui-automation-verify)  
例えばVSC2017を入れていると、この辺にあるようです。

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\inspect.exe"  
"C:\Program Files (x86)\Windows
Kits\10\bin\10.0.17763.0\x64\UIAVerify\VisualUIAVerifyNative.exe"

"Windows
Kits"の下には、Windows版数/SDK版数/.NET版数/CPUbit数/アーキテクチャなどにより複数のフォルダがあり、同じ名前で複数個所に存在しています。


CC BY-SA 4.0
2019-04-04T14:25:15.717
53921
2019-04-05T00:11:55.030
2019-04-05T00:11:55.030
26370
26370
53917
answer


相手がWindows Formアプリでしたら、Friendlyはどうでしょう。

<https://github.com/Codeer-Software/Friendly>

本来はUIのテストを自動化するために作られたもののようですが、やり方次第で「外部プロセスの任意のコントロールの値をGet/Setする」ことが可能です。

NuGetで以下の2つをインストールすれば、最低限は使えます。

  * Codeer.Friendly
  * Codeer.Friendly.Windows


CC BY-SA 4.0
2019-04-05T05:05:57.897
53931
2019-04-05T05:05:57.897
9801
53917
answer


本日リリースされた.NET Framework
4.8にアップデートされますと、[`DataGridView`も改善され](https://devblogs.microsoft.com/dotnet/announcing-
the-net-framework-4-8/)、[UI Automation](https://docs.microsoft.com/en-
us/windows/desktop/WinAuto/entry-uiauto-win32)に対応しているようです。アナウンスによれば

> Currently the accessible hierarchy (UI Automation tree) shows the editing
> box tree element as a child of currently edited cell but not as a root child
> element of DataGridView.

とのことで、既に対応していた上で、4.8では編集中のセルについても階層構造が正しく取得できるように改善されたそうです。

Windows SDKに含まれている[`Inspect.exe`](https://docs.microsoft.com/en-
us/windows/desktop/winauto/inspect-
objects)で表示してみたところ確かに.NETアップデート前でも表示内容は取得できていました。

というわけで、UI Automationで取得するのが正攻法のようです。


CC BY-SA 4.0
2019-04-18T21:54:51.433
54301
2019-04-18T21:54:51.433
4236
53917
answer