質問編集履歴

3

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

2018/10/02 08:26

投稿

dewdtm
dewdtm

スコア8

test CHANGED
File without changes
test CHANGED
@@ -1,349 +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
- 【ハンドル+Class名+title情報をTreeView1に列挙するコード】
50
-
51
-
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
- 【ハンドル情報のみをTreeView2に列挙するコード】
176
-
177
-
178
-
179
- Private Sub NodesS()
180
-
181
- Dim i As Long
182
-
183
- Dim J As Long
184
-
185
- Dim strClass As String
186
-
187
- Dim strTitle As String
188
-
189
- Dim strSpace As String
190
-
191
-
192
-
193
- ' ウィンドウとコントロールの全ての情報を取得
194
-
195
- Dim colWindows As Collection
196
-
197
- Set colWindows = GetAllWindows()
198
-
199
-
200
-
201
- ' 親ウィンドウ毎のコレクションループ
202
-
203
- For i = 1 To colWindows.Count
204
-
205
- ' 子コントロール毎のコレクション取得
206
-
207
- Dim colChilds As Collection
208
-
209
- Set colChilds = colWindows.Item(i)
210
-
211
-
212
-
213
- 'If colChilds.Count >= 1 Then ' 全ての親ウィンドウを対象
214
-
215
- If colChilds.Count > 1 Then ' 子コントロールを持つ物のみ対象
216
-
217
- ' 子コントロール毎のコレクションループ
218
-
219
- For J = 1 To colChilds.Count
220
-
221
- If J = 1 Then
222
-
223
- ' 親ウィンドウの情報をツリービューへ追加
224
-
225
- Call TreeView2.Nodes.Add(, , _
226
-
227
- "R" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8), _
228
-
229
- "&H" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8))
230
-
231
- Else
232
-
233
- ' 子コントロールの情報をツリービューへ追加
234
-
235
- Call TreeView2.Nodes.Add("R" & Right$("00000000" & Hex(colChilds.Item(1)(0)), 8), _
236
-
237
- tvwChild, _
238
-
239
- "C" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8), _
240
-
241
- "&H" & Right$("00000000" & Hex(colChilds.Item(J)(0)), 8))
242
-
243
- End If
244
-
245
- Next J
246
-
247
- End If
248
-
249
- Next i
250
-
251
- End Sub
252
-
253
- ```
254
-
255
-
256
-
257
- ```ここに言語を入力
258
-
259
- 【外部ハンドルを取得して文字列とクリック処理を送信するコード】
260
-
261
- 'Login画面の親子ハンドルの取得とLoginID・Password・OKボタンを送信
262
-
263
- hWndChild1 = 0
264
-
265
- hWndChild2 = 0
266
-
267
- hWndChild3 = 0
268
-
269
- Do
270
-
271
- hwndParent = FindWindow("Class名", "title")
272
-
273
- Call NodesS
274
-
275
- Call NodesW
276
-
277
- If hwndParent <> 0 Then
278
-
279
- Call NodesS
280
-
281
- Call NodesW
282
-
283
- For idx = 1 To TreeView2.Nodes.Count
284
-
285
- If CLng(TreeView2.Nodes(idx)) = hwndParent Then
286
-
287
- hWndChild1 = TreeView2.Nodes(idx + 9)
288
-
289
- hWndChild2 = TreeView2.Nodes(idx + 10)
290
-
291
- hWndChild3 = TreeView2.Nodes(idx + 11)
292
-
293
- Exit Do
294
-
295
- End If
296
-
297
- Next
298
-
299
- End If
300
-
301
- DoEvents
302
-
303
- Loop
304
-
305
-
306
-
307
- st = Now
308
-
309
- Do
310
-
311
- DoEvents
312
-
313
- Ret = IsWindowEnabled(hWndChild1)
314
-
315
- If DateDiff("s", st, Now) >= 10 Then Exit Do
316
-
317
- Loop While Ret = 0
318
-
319
-
320
-
321
- If Ret = 0 Then
322
-
323
- Debug.Print "time out"
324
-
325
- End If
326
-
327
-
328
-
329
- SetForegroundWindow hwndParent
330
-
331
- strDt = "LoginID"
332
-
333
- lngRc = SendMessage(hWndChild1, WM_SETTEXT, 0, strDt)
334
-
335
- strDt2 = "password"
336
-
337
- lngRc = SendMessage(hWndChild2, WM_SETTEXT, 0, strDt2)
338
-
339
- lngRc = SendMessage(hWndChild3, BM_CLICK, 0, 0)
340
-
341
- ```
342
-
343
-
344
-
345
- 現在標準モジュールは、VB.NET側のコードを使用ており
1
+ 的確な回答が得られなかったためのコメントは削除いたしました
346
-
347
-
348
-
349
- どうかご教示の程、よろしくお願い致します。

2

error項目の削除 本題は変換について知りたい

2018/10/02 08:26

投稿

dewdtm
dewdtm

スコア8

test CHANGED
File without changes
test CHANGED
@@ -344,22 +344,6 @@
344
344
 
345
345
  現在、標準モジュールは、VB.NET側のコードを使用しております。
346
346
 
347
- また、当方が修正できそうにないエラーが出る箇所は、
347
+
348
-
349
- .Nodes
350
-
351
- DoEvents
352
-
353
- Right$
354
-
355
- Set
356
-
357
- LenB
358
-
359
- strSpace = StrConv(String(50, " "), vbFromUnicode)
360
-
361
-
362
-
363
- かなり複雑になっておりますが、
364
348
 
365
349
  どうかご教示の程、よろしくお願い致します。

1

コードブロックの適用

2018/10/02 06:37

投稿

dewdtm
dewdtm

スコア8

test CHANGED
File without changes
test CHANGED
@@ -44,12 +44,12 @@
44
44
 
45
45
 
46
46
 
47
- ここからコードーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
47
+ ```ここに言語を入力
48
-
49
-
50
48
 
51
49
  【ハンドル+Class名+title情報をTreeView1に列挙するコード】
52
50
 
51
+
52
+
53
53
  Private Sub NodesW()
54
54
 
55
55
  Dim i As Long
@@ -166,7 +166,11 @@
166
166
 
167
167
  End Sub
168
168
 
169
-
169
+ ```
170
+
171
+
172
+
173
+ ```ここに言語を入力
170
174
 
171
175
  【ハンドル情報のみをTreeView2に列挙するコード】
172
176
 
@@ -246,7 +250,11 @@
246
250
 
247
251
  End Sub
248
252
 
249
-
253
+ ```
254
+
255
+
256
+
257
+ ```ここに言語を入力
250
258
 
251
259
  【外部ハンドルを取得して文字列とクリック処理を送信するコード】
252
260
 
@@ -330,9 +338,7 @@
330
338
 
331
339
  lngRc = SendMessage(hWndChild3, BM_CLICK, 0, 0)
332
340
 
333
-
334
-
335
- ここまでーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
341
+ ```
336
342
 
337
343
 
338
344