質問編集履歴

1

まともな回答が得られなかった

2018/10/02 08:27

投稿

dewdtm
dewdtm

スコア8

test CHANGED
File without changes
test CHANGED
@@ -1,375 +1 @@
1
- いつもお世話になっております。
2
-
3
-
4
-
5
- 以前にこちらのサイト様で、ExcelVBAにおける外部アプリの操作(主にハンドル関連)についてご質問させていただき、おかげさまで外部データベース入力の自動化を実現させることが出来ました。
6
-
7
-
8
-
9
- 【以前の質問ページ】
10
-
11
- https://teratail.com/questions/135393
12
-
13
- https://teratail.com/questions/135546
14
-
15
-
16
-
17
- 今回は、ExcelVBAでコーディングしたそのプログラムを、VB.NETでも使用できるよう、
18
-
19
- 変換したい思い、再度ご質問に上がりました。
20
-
21
-
22
-
23
- システムの根幹となるハンドル取得のコードは、
24
-
25
- 下記のサイト様からコピーしたものです。
26
-
27
- 【参考にしたコード】
28
-
29
- http://nonsoft.la.coocan.jp/SoftSample/SampleEnumWindows.html
30
-
31
-
32
-
33
- こちらにはご親切にもVB6とVB.NET両方のコードが載せられているのですが、
34
-
35
- VB.NETの方は、肝心のハンドルが取得できず、Class名とTitleしか取得できません。
36
-
37
- まずこのハンドル+Class名+titleをTreeView1に列挙すること、
38
-
39
- Class名とtitleを除外したハンドルのみの情報をTreeView2に列挙すること、
40
-
41
- そして、ハンドル取得⇒送信すること、
42
-
43
- この三点のコードを変換したい思っております。
44
-
45
-
46
-
47
- ここからコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
48
-
49
-
50
-
51
- 【ハンドル+Class名+title情報をTreeView1に列挙するコード】
52
-
53
- Private Sub NodesW()
54
-
55
- Dim i As Long
56
-
57
- Dim J As Long
58
-
59
- Dim strClass As String
60
-
61
- Dim strTitle As String
62
-
63
- Dim strSpace As String
64
-
65
-
66
-
67
- ' ウィンドウとコントロールの全ての情報を取得
68
-
69
- Dim colWindows As Collection
70
-
71
- Set colWindows = GetAllWindows()
72
-
73
-
74
-
75
- ' 親ウィンドウ毎のコレクションループ
76
-
77
- For i = 1 To colWindows.Count
78
-
79
- ' 子コントロール毎のコレクション取得
80
-
81
- Dim colChilds As Collection
82
-
83
- Set colChilds = colWindows.Item(i)
84
-
85
-
86
-
87
- 'If colChilds.Count >= 1 Then ' 全ての親ウィンドウを対象
88
-
89
- If colChilds.Count > 1 Then ' 子コントロールを持つ物のみ対象
90
-
91
- ' 子コントロール毎のコレクションループ
92
-
93
-
94
-
95
- For J = 1 To colChilds.Count
96
-
97
- strSpace = StrConv(String(50, " "), vbFromUnicode)
98
-
99
-
100
-
101
- ' コレクションからクラス名取得
102
-
103
- strClass = StrConv(colChilds.Item(J)(1), vbFromUnicode)
104
-
105
- If LenB(strClass) < 30 Then
106
-
107
- strClass = LeftB$(strClass & strSpace, 30)
108
-
109
- End If
110
-
111
- strClass = StrConv(strClass, vbUnicode)
112
-
113
-
114
-
115
- ' コレクションから文字列取得
116
-
117
- strTitle = StrConv(colChilds.Item(J)(2), vbFromUnicode)
118
-
119
- If LenB(strTitle) < 50 Then
120
-
121
- strTitle = LeftB$(strTitle & strSpace, 50)
122
-
123
- End If
124
-
125
- strTitle = StrConv(strTitle, vbUnicode)
126
-
127
-
128
-
129
- If J = 1 Then
130
-
131
- ' 親ウィンドウの情報をツリービューへ追加
132
-
133
- Call TreeView1.Nodes.Add( _
134
-
135
- , , "R" & _
136
-
137
- Right$("00000000" & Hex(colChilds.Item(J)(0)), 8), _
138
-
139
- Right$("00000000" & Hex(colChilds.Item(J)(0)), 8) & " - " & _
140
-
141
- strClass & " - " & strTitle)
142
-
143
- Else
144
-
145
- ' 子コントロールの情報をツリービューへ追加
146
-
147
- Call TreeView1.Nodes.Add( _
148
-
149
- "R" & Right$("00000000" & Hex(colChilds.Item(1)(0)), 8), _
150
-
151
- tvwChild, "C" & _
152
-
153
- Right$("00000000" & Hex(colChilds.Item(J)(0)), 8), _
154
-
155
- Right$("00000000" & Hex(colChilds.Item(J)(0)), 8) & " - " & _
156
-
157
- strClass & " - " & strTitle)
158
-
159
- End If
160
-
161
- Next J
162
-
163
- End If
164
-
165
- Next i
166
-
167
- End Sub
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
-
176
-
177
-
178
-
179
- 【ハンドル情報のみをTreeView2に列挙するコード】
180
-
181
-
182
-
183
- Private Sub NodesS()
184
-
185
- Dim i As Long
186
-
187
- Dim J As Long
188
-
189
- Dim strClass As String
190
-
191
- Dim strTitle As String
192
-
193
- Dim strSpace As String
194
-
195
-
196
-
197
- ' ウィンドウとコントロールの全ての情報を取得
198
-
199
- Dim colWindows As Collection
200
-
201
- Set colWindows = GetAllWindows()
202
-
203
-
204
-
205
- ' 親ウィンドウ毎のコレクションループ
206
-
207
- For i = 1 To colWindows.Count
208
-
209
- ' 子コントロール毎のコレクション取得
210
-
211
- Dim colChilds As Collection
212
-
213
- Set colChilds = colWindows.Item(i)
214
-
215
-
216
-
217
- 'If colChilds.Count >= 1 Then ' 全ての親ウィンドウを対象
218
-
219
- If colChilds.Count > 1 Then ' 子コントロールを持つ物のみ対象
220
-
221
- ' 子コントロール毎のコレクションループ
222
-
223
- For J = 1 To colChilds.Count
224
-
225
- If J = 1 Then
226
-
227
- ' 親ウィンドウの情報をツリービューへ追加
228
-
229
- Call TreeView2.Nodes.Add(, , _
230
-
231
- "R" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8), _
232
-
233
- "&H" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8))
234
-
235
- Else
236
-
237
- ' 子コントロールの情報をツリービューへ追加
238
-
239
- Call TreeView2.Nodes.Add("R" & Right$("00000000" & Hex(colChilds.Item(1)(0)), 8), _
240
-
241
- tvwChild, _
242
-
243
- "C" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8), _
244
-
245
- "&H" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8))
246
-
247
- End If
248
-
249
- Next J
250
-
251
- End If
252
-
253
- Next i
254
-
255
- End Sub
256
-
257
-
258
-
259
-
260
-
261
-
262
-
263
-
264
-
265
-
266
-
267
- 【外部ハンドルを取得して文字列とクリック処理を送信するコード】
268
-
269
- 'Login画面の親子ハンドルの取得とLoginID・Password・OKボタンを送信
270
-
271
- hWndChild1 = 0
272
-
273
- hWndChild2 = 0
274
-
275
- hWndChild3 = 0
276
-
277
- Do
278
-
279
- hwndParent = FindWindow("Class名", "title")
280
-
281
- Call NodesS
282
-
283
- Call NodesW
284
-
285
- If hwndParent <> 0 Then
286
-
287
- Call NodesS
288
-
289
- Call NodesW
290
-
291
- For idx = 1 To TreeView2.Nodes.Count
292
-
293
- If CLng(TreeView2.Nodes(idx)) = hwndParent Then
294
-
295
- hWndChild1 = TreeView2.Nodes(idx + 9)
296
-
297
- hWndChild2 = TreeView2.Nodes(idx + 10)
298
-
299
- hWndChild3 = TreeView2.Nodes(idx + 11)
300
-
301
- Exit Do
302
-
303
- End If
304
-
305
- Next
306
-
307
- End If
308
-
309
- DoEvents
310
-
311
- Loop
312
-
313
-
314
-
315
- st = Now
316
-
317
- Do
318
-
319
- DoEvents
320
-
321
- Ret = IsWindowEnabled(hWndChild1)
322
-
323
- If DateDiff("s", st, Now) >= 10 Then Exit Do
324
-
325
- Loop While Ret = 0
326
-
327
-
328
-
329
- If Ret = 0 Then
330
-
331
- Debug.Print "time out"
332
-
333
- End If
334
-
335
-
336
-
337
- SetForegroundWindow hwndParent
338
-
339
- strDt = "LoginID"
340
-
341
- lngRc = SendMessage(hWndChild1, WM_SETTEXT, 0, strDt)
342
-
343
- strDt2 = "password"
344
-
345
- lngRc = SendMessage(hWndChild2, WM_SETTEXT, 0, strDt2)
346
-
347
- lngRc = SendMessage(hWndChild3, BM_CLICK, 0, 0)
348
-
349
-
350
-
351
- ここまでーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
352
-
353
-
354
-
355
- 現在標準モジュールは、VB.NET側のコードを使用ており
1
+ 的確な回答が得られなかったためのコメントは削除いたしました
356
-
357
- また、当方が修正できそうにないエラーが出る箇所は、
358
-
359
- .Nodes
360
-
361
- DoEvents
362
-
363
- Right$
364
-
365
- Set
366
-
367
- LenB
368
-
369
- **strSpace**~~ = StrConv(~~**String**~~(50, " "),~~ **vbFromUnicode**)
370
-
371
-
372
-
373
- かなり複雑になっておりますが、
374
-
375
- どうかご教示の程、よろしくお願い致します。