質問編集履歴

4

c#のコードを表示したいときは```c#じゃなくて```csだったので修正。分かり辛いわ

2019/06/20 23:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -34,196 +34,196 @@
34
34
 
35
35
 
36
36
 
37
+ ```cs
38
+
39
+ Button b = (Button)c; // 変数cについては ### 該当のソースコードを 参照ください。
40
+
41
+ object buttonInstance = Activator.CreateInstance(buttonType);
42
+
43
+ MethodInfo PerformClickInfo = buttonType.GetMethod("PerformClick",
44
+
45
+ BindingFlags.Public | BindingFlags.InvokeMethod);
46
+
47
+
48
+
49
+ PerformClickInfo.Invoke( buttonInstance, new object[0]);
50
+
51
+ // PerformClick()の引数はvoidだからnew object[0]で実行可能なはずなのに...
52
+
53
+
54
+
55
+ // NullReferenceException{"オブジェクト参照がオブジェクト インスタンスに設定されていません。"}
56
+
57
+ // 型 'System.NullReferenceException' のハンドルされていない例外が MSClacUIAutomation.exe で発生しました
58
+
59
+ //
60
+
61
+ // 追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。
62
+
63
+ ```
64
+
65
+
66
+
67
+ ```cs
68
+
69
+ Button b = (Button)c; // 変数cについては ### 該当のソースコードを 参照ください。
70
+
71
+ Delegate local_InvokePerformClick = Delegate.CreateDelegate(typeof(Action),
72
+
73
+ this,
74
+
75
+ b.GetType().GetMethod("PerformClick"));
76
+
77
+ // どの引数が何を欲しているのかわからない・・・
78
+
79
+
80
+
81
+ // ArgumentException{"ターゲット メソッドとデリゲート型との間に、シグネチャまたはセキュリティ透過性の互換性がないため、ターゲット メソッドにバインドできません。"}
82
+
83
+ // 型 'System.ArgumentException' のハンドルされていない例外が mscorlib.dll で発生しました
84
+
85
+ //
86
+
87
+ // 追加情報:ターゲット メソッドとデリゲート型との間に、シグネチャまたはセキュリティ透過性の互換性がないため、ターゲット メソッドにバインドできません。
88
+
89
+
90
+
91
+ Invoke(local_InvokePerformClick);
92
+
93
+
94
+
95
+ ```
96
+
97
+
98
+
99
+ ### 該当のソースコード
100
+
101
+
102
+
37
103
  ```c#
38
104
 
39
- Button b = (Button)c; // 変数cについては ### 該当のソースコードを 参照ください。
40
-
41
- object buttonInstance = Activator.CreateInstance(buttonType);
42
-
43
- MethodInfo PerformClickInfo = buttonType.GetMethod("PerformClick",
44
-
45
- BindingFlags.Public | BindingFlags.InvokeMethod);
46
-
47
-
48
-
49
- PerformClickInfo.Invoke( buttonInstance, new object[0]);
50
-
51
- // PerformClick()の引数はvoidだからnew object[0]で実行可能なはずなのに...
52
-
53
-
54
-
55
- // NullReferenceException{"オブジェクト参照がオブジェクト インスタンスに設定されていません。"}
56
-
57
- // 'System.NullReferenceException' のハンドルされていない例外が MSClacUIAutomation.exe で発生しました
58
-
59
- //
60
-
61
- // 追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。
105
+ using System.Threading;
106
+
107
+ using System.Reflection;
108
+
109
+
110
+
111
+ public partial class Form1 : Form
112
+
113
+ {
114
+
115
+ ThreadUITarget m_uiAutomationTargetThread;
116
+
117
+ DataGridView m_uiAutoTargetDGV;
118
+
119
+
120
+
121
+ public Form1()
122
+
123
+ {
124
+
125
+ InitializeComponent();
126
+
127
+ }
128
+
129
+
130
+
131
+ private void Form1_Load(object sender, EventArgs e)
132
+
133
+ {
134
+
135
+ // Assembly.EntryPoint.Invoke()するとAssembly.Load()したやつにスレッドを占有されちゃうのでサブスレッドを生成
136
+
137
+ new Thread(new ThreadStart( RunApp));
138
+
139
+ }
140
+
141
+
142
+
143
+ private void RunApp()
144
+
145
+ {
146
+
147
+ // このプログラムのプロジェクトからexeファイルを参照したtargetAppって名前のWindows Formアプリを立ち上げる
148
+
149
+ Assembly assemblyTargetApp = Assembly.Load("targetApp");
150
+
151
+ assemblyTargetApp.EntryPoint.Invoke(null, new object[0]);
152
+
153
+ }
154
+
155
+
156
+
157
+ private void button1_Click(object sender, EventArgs e)
158
+
159
+ {
160
+
161
+ FormCollection fc = Application.OpenForms;
162
+
163
+ // FormCollectionには自分も含まれちゃうので外部操作を行いたいアプリの親フォームを捜してあげる
164
+
165
+ Form targetForm = null;
166
+
167
+ foreach(Form f in fc)
168
+
169
+ {
170
+
171
+ // 外部操作を行いたいアプリのFormのTextプロパティに"targetApp"が登録されてる前提
172
+
173
+ if (f.Text == "targetApp")
174
+
175
+ {
176
+
177
+ targetForm = f;
178
+
179
+ break;
180
+
181
+ }
182
+
183
+ }
184
+
185
+ // 必ず見つかる(確信)
186
+
187
+ foreach (Control c in targetForm.Controls)
188
+
189
+ {
190
+
191
+ if (c is DataGridView)
192
+
193
+ {
194
+
195
+ string msg;
196
+
197
+ DataGridView dgv = (DataGridView)c;
198
+
199
+ foreach( DataGridViewRow r in dgv.Rows)
200
+
201
+ foreach( DataGridViewCell c in r.cells)
202
+
203
+ msg += c.Value.ToString() + "\n"; // DataGridViewはDataGridViewCells.Value==nullなセルが発生することがあるけどここでは無視
204
+
205
+
206
+
207
+ Messagebox.Show(msg);
208
+
209
+ }
210
+
211
+ else if(c is Button)
212
+
213
+ {
214
+
215
+ // ここに ### 発生している問題・エラーメッセージ に乗せたコードが載るイメージ
216
+
217
+ }
218
+
219
+ }
220
+
221
+ }
62
222
 
63
223
  ```
64
224
 
65
225
 
66
226
 
67
- ```c#
68
-
69
- Button b = (Button)c; // 変数cについては ### 該当のソースコードを 参照ください。
70
-
71
- Delegate local_InvokePerformClick = Delegate.CreateDelegate(typeof(Action),
72
-
73
- this,
74
-
75
- b.GetType().GetMethod("PerformClick"));
76
-
77
- // どの引数が何を欲しているのかわからない・・・
78
-
79
-
80
-
81
- // ArgumentException{"ターゲット メソッドとデリゲート型との間に、シグネチャまたはセキュリティ透過性の互換性がないため、ターゲット メソッドにバインドできません。"}
82
-
83
- // 型 'System.ArgumentException' のハンドルされていない例外が mscorlib.dll で発生しました
84
-
85
- //
86
-
87
- // 追加情報:ターゲット メソッドとデリゲート型との間に、シグネチャまたはセキュリティ透過性の互換性がないため、ターゲット メソッドにバインドできません。
88
-
89
-
90
-
91
- Invoke(local_InvokePerformClick);
92
-
93
-
94
-
95
- ```
96
-
97
-
98
-
99
- ### 該当のソースコード
100
-
101
-
102
-
103
- ```c#
104
-
105
- using System.Threading;
106
-
107
- using System.Reflection;
108
-
109
-
110
-
111
- public partial class Form1 : Form
112
-
113
- {
114
-
115
- ThreadUITarget m_uiAutomationTargetThread;
116
-
117
- DataGridView m_uiAutoTargetDGV;
118
-
119
-
120
-
121
- public Form1()
122
-
123
- {
124
-
125
- InitializeComponent();
126
-
127
- }
128
-
129
-
130
-
131
- private void Form1_Load(object sender, EventArgs e)
132
-
133
- {
134
-
135
- // Assembly.EntryPoint.Invoke()するとAssembly.Load()したやつにスレッドを占有されちゃうのでサブスレッドを生成
136
-
137
- new Thread(new ThreadStart( RunApp));
138
-
139
- }
140
-
141
-
142
-
143
- private void RunApp()
144
-
145
- {
146
-
147
- // このプログラムのプロジェクトからexeファイルを参照したtargetAppって名前のWindows Formアプリを立ち上げる
148
-
149
- Assembly assemblyTargetApp = Assembly.Load("targetApp");
150
-
151
- assemblyTargetApp.EntryPoint.Invoke(null, new object[0]);
152
-
153
- }
154
-
155
-
156
-
157
- private void button1_Click(object sender, EventArgs e)
158
-
159
- {
160
-
161
- FormCollection fc = Application.OpenForms;
162
-
163
- // FormCollectionには自分も含まれちゃうので外部操作を行いたいアプリの親フォームを捜してあげる
164
-
165
- Form targetForm = null;
166
-
167
- foreach(Form f in fc)
168
-
169
- {
170
-
171
- // 外部操作を行いたいアプリのFormのTextプロパティに"targetApp"が登録されてる前提
172
-
173
- if (f.Text == "targetApp")
174
-
175
- {
176
-
177
- targetForm = f;
178
-
179
- break;
180
-
181
- }
182
-
183
- }
184
-
185
- // 必ず見つかる(確信)
186
-
187
- foreach (Control c in targetForm.Controls)
188
-
189
- {
190
-
191
- if (c is DataGridView)
192
-
193
- {
194
-
195
- string msg;
196
-
197
- DataGridView dgv = (DataGridView)c;
198
-
199
- foreach( DataGridViewRow r in dgv.Rows)
200
-
201
- foreach( DataGridViewCell c in r.cells)
202
-
203
- msg += c.Value.ToString() + "\n"; // DataGridViewはDataGridViewCells.Value==nullなセルが発生することがあるけどここでは無視
204
-
205
-
206
-
207
- Messagebox.Show(msg);
208
-
209
- }
210
-
211
- else if(c is Button)
212
-
213
- {
214
-
215
- // ここに ### 発生している問題・エラーメッセージ に乗せたコードが載るイメージ
216
-
217
- }
218
-
219
- }
220
-
221
- }
222
-
223
- ```
224
-
225
-
226
-
227
227
  実際に実行させてるコードを元に読みやすくなるよう改変したコードなのでまんまで動かすことはできないと思います。参考まで。
228
228
 
229
229
 

3

リンクの誤りを修正

2019/06/20 23:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
 
6
6
 
7
- 以前の質問「[既存のアプリでDataGridViewなどを用いて表示されている内容を取得したい](https://teratail.com/questions/79529)」の続き・・・というより、同じ前提で別のことがしたいために投稿した質問です。
7
+ 以前の質問「[既存のアプリでDataGridViewなどを用いて表示されている内容を取得したい](https://teratail.com/questions/194548)」の続き・・・というより、同じ前提で別のことがしたいために投稿した質問です。
8
-
8
+
9
- C#で作成されたと聞いているアプリケーションを外部から自動化する必要があり、[実行ファイルを参照してコントロールを参照する方法](https://teratail.com/questions/79529)を教えてもらいました。
9
+ C#で作成されたと聞いているアプリケーションを外部から自動化する必要があり、[実行ファイルを参照してコントロールを参照する方法](https://teratail.com/questions/194548)を教えてもらいました。
10
10
 
11
11
  ウィンドウハンドルを利用した場合は`TextBox`の読み書きや`Button`の押下が行えたのですが、今回は`DataGridView`を参照する必要性から上記の方法に方針を変更しました。
12
12
 

2

説明不足な内容を改善

2019/06/20 03:56

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
 
6
6
 
7
+ 以前の質問「[既存のアプリでDataGridViewなどを用いて表示されている内容を取得したい](https://teratail.com/questions/79529)」の続き・・・というより、同じ前提で別のことがしたいために投稿した質問です。
8
+
7
9
  C#で作成されたと聞いているアプリケーションを外部から自動化する必要があり、[実行ファイルを参照してコントロールを参照する方法](https://teratail.com/questions/79529)を教えてもらいました。
8
10
 
9
11
  ウィンドウハンドルを利用した場合は`TextBox`の読み書きや`Button`の押下が行えたのですが、今回は`DataGridView`を参照する必要性から上記の方法に方針を変更しました。

1

おかしなことを言ってる部分を修正

2019/06/19 09:09

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,9 @@
10
10
 
11
11
 
12
12
 
13
- リフレクションを利用する方法に行き着いたのは別スレッドの`Button`コントロールなどは操作する方法を調べたためです。
13
+ `Invoke()`を利用する方法などに行き着いたのは別スレッドの`Button`コントロール等のUIを操作する方法を調べたためです。
14
+
15
+ ほかのアプローチがあるならばそれでも構いません。
14
16
 
15
17
  既存アプリケーションを`Assembly`オブジェクトから実行したときにスレッドを分けないと自作アプリ側から何もできないのでスレッド分けは回避不能だと思っています。
16
18