質問編集履歴

7

修正

2020/04/29 10:50

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
File without changes
test CHANGED
@@ -286,6 +286,12 @@
286
286
 
287
287
  count = 1;
288
288
 
289
+ _hWndList = new ClassApp();
290
+
291
+ _hWndList.Interface = new InnerClass[1];
292
+
293
+
294
+
289
295
  EnumWindows(new EnumWindowsDelegate(EnumWindowCallBack), IntPtr.Zero);
290
296
 
291
297
 

6

リスト修正しました

2020/04/29 10:50

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
File without changes
test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
 
126
126
 
127
- '''VBA
127
+ ```VBA
128
128
 
129
129
  Sub Vba()
130
130
 

5

rev

2020/04/29 10:34

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
File without changes
test CHANGED
@@ -116,6 +116,38 @@
116
116
 
117
117
 
118
118
 
119
+ もちろん、呼び出しのエントリポイントの外にクラス宣言があり
120
+
121
+ このまま走らせても、「インデックスが配列の境界外」というエラーになってしまいます。
122
+
123
+
124
+
125
+
126
+
127
+ '''VBA
128
+
129
+ Sub Vba()
130
+
131
+
132
+
133
+ Set DLL = New ExcelVbaExt.WindowWhnd
134
+
135
+ Dim com As Variant
136
+
137
+ Set com = DLL.WindowTitleList
138
+
139
+ c = com.Interface
140
+
141
+
142
+
143
+ End Sub
144
+
145
+
146
+
147
+ ```
148
+
149
+
150
+
119
151
  ```C#
120
152
 
121
153
  using System;

4

rev

2020/04/29 09:34

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
File without changes
test CHANGED
@@ -107,3 +107,211 @@
107
107
  の例がありましたが、C#のソースがあれば紹介いただきたいです。
108
108
 
109
109
  [リンク内容](http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/01094.html)
110
+
111
+
112
+
113
+
114
+
115
+ #現在のコード
116
+
117
+
118
+
119
+ ```C#
120
+
121
+ using System;
122
+
123
+ using System.Runtime.InteropServices;
124
+
125
+ using System.Text;
126
+
127
+
128
+
129
+ namespace ExcelVbaExt
130
+
131
+ {
132
+
133
+ [ComVisible(true)]
134
+
135
+ [ClassInterface(ClassInterfaceType.AutoDual)]
136
+
137
+ public class InnerClass
138
+
139
+ {
140
+
141
+ public int WHnd;
142
+
143
+ public string APPName;
144
+
145
+ public int Left;
146
+
147
+ public int Top;
148
+
149
+ public int Right;
150
+
151
+ public int Bottom;
152
+
153
+ }
154
+
155
+
156
+
157
+ [ComVisible(true)]
158
+
159
+ [ClassInterface(ClassInterfaceType.AutoDual)]
160
+
161
+ public class ClassApp
162
+
163
+ {
164
+
165
+ public InnerClass[] Interface;
166
+
167
+ }
168
+
169
+
170
+
171
+ [ComVisible(true)]
172
+
173
+ [InterfaceType(ComInterfaceType.InterfaceIsDual)]
174
+
175
+ public interface IWindowWhnd
176
+
177
+ {
178
+
179
+ ClassApp WindowTitleList();
180
+
181
+ }
182
+
183
+
184
+
185
+ [ClassInterface(ClassInterfaceType.None)]
186
+
187
+ public class WindowWhnd : IWindowWhnd
188
+
189
+ {
190
+
191
+ public static ClassApp _hWndList = new ClassApp();
192
+
193
+ public static int count;
194
+
195
+
196
+
197
+ [DllImport("user32.dll")]
198
+
199
+ private static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
200
+
201
+
202
+
203
+ [StructLayout(LayoutKind.Sequential)]
204
+
205
+ private struct RECT
206
+
207
+ {
208
+
209
+ public int left;
210
+
211
+ public int top;
212
+
213
+ public int right;
214
+
215
+ public int bottom;
216
+
217
+ }
218
+
219
+
220
+
221
+ [DllImport("user32.dll")]
222
+
223
+ [return: MarshalAs(UnmanagedType.Bool)]
224
+
225
+ private extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, IntPtr lparam);
226
+
227
+
228
+
229
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
230
+
231
+ private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
232
+
233
+
234
+
235
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
236
+
237
+ private static extern int GetWindowTextLength(IntPtr hWnd);
238
+
239
+
240
+
241
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
242
+
243
+ private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
244
+
245
+
246
+
247
+ private delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam);
248
+
249
+
250
+
251
+ public ClassApp WindowTitleList()
252
+
253
+ {
254
+
255
+ count = 1;
256
+
257
+ EnumWindows(new EnumWindowsDelegate(EnumWindowCallBack), IntPtr.Zero);
258
+
259
+
260
+
261
+ return _hWndList;
262
+
263
+ }
264
+
265
+
266
+
267
+ private static bool EnumWindowCallBack(IntPtr hWnd, IntPtr lparam)
268
+
269
+ {
270
+
271
+ int textLen = GetWindowTextLength(hWnd);
272
+
273
+ if (0 < textLen)
274
+
275
+ {
276
+
277
+ StringBuilder tsb = new StringBuilder(textLen + 1);
278
+
279
+ GetWindowText(hWnd, tsb, tsb.Capacity);
280
+
281
+
282
+
283
+ RECT rect;
284
+
285
+ bool flag = GetWindowRect(hWnd, out rect);
286
+
287
+
288
+
289
+ count += 1;
290
+
291
+ Array.Resize(ref _hWndList.Interface, count);
292
+
293
+ _hWndList.Interface[count] = new InnerClass();
294
+
295
+ _hWndList.Interface[count].WHnd = (int)hWnd;
296
+
297
+ _hWndList.Interface[count].APPName = tsb.ToString();
298
+
299
+ _hWndList.Interface[count].Left = rect.left;
300
+
301
+ _hWndList.Interface[count].Top = rect.top;
302
+
303
+ _hWndList.Interface[count].Right = rect.right;
304
+
305
+ _hWndList.Interface[count].Bottom = rect.bottom;
306
+
307
+ }
308
+
309
+ return true;
310
+
311
+ }
312
+
313
+ }
314
+
315
+ }
316
+
317
+ ```

3

rev

2020/04/29 09:31

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
File without changes
test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
  リストを見ると、コールバック関数を使っているのですが、
68
68
 
69
- main関数の戻り値は、常にBOOLしか戻ってこない状態で、
69
+ EnumWindows関数の戻り値は、常にBOOLしか戻ってこない状態で、
70
70
 
71
71
  取得したいハンドル名を、WINDOWSコンソールに吐き出されています。
72
72
 

2

rev

2020/04/29 09:07

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
@@ -1 +1 @@
1
- C#でのウィンドウ名取得について
1
+ C#でのウィンドウ名取得について EnumWindows
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  参考ソース
8
8
 
9
- [リンク内容](https://docs.microsoft.com/ja-jp/dotnet/framework/interop/how-to-implement-callback-functions)
9
+ [EnumWindows](https://docs.microsoft.com/ja-jp/dotnet/framework/interop/how-to-implement-callback-functions)
10
10
 
11
11
 
12
12
 

1

初回

2020/04/29 09:06

投稿

yuujiMotoki
yuujiMotoki

スコア90

test CHANGED
File without changes
test CHANGED
@@ -7,42 +7,6 @@
7
7
  参考ソース
8
8
 
9
9
  [リンク内容](https://docs.microsoft.com/ja-jp/dotnet/framework/interop/how-to-implement-callback-functions)
10
-
11
-
12
-
13
- リストを見ると、コールバック関数を使っているのですが、
14
-
15
- main関数の戻り値は、常にBOOLしか戻ってこない状態で、
16
-
17
- 取得したいハンドル名を、WINDOWSコンソールに吐き出されています。
18
-
19
-
20
-
21
- #知りたいこと
22
-
23
-
24
-
25
- 最終的にはDLLとして、配列変数にして戻したいと思っています。
26
-
27
-
28
-
29
- 方法としては
30
-
31
-
32
-
33
- 1)コンソールの出力をテキストにして戻す
34
-
35
-  → DLLを呼ぶ側に解読するソースをつけないと行けないので、不細工です。
36
-
37
-
38
-
39
- 2)メインの外にグローバル配列変数を作る
40
-
41
-  → そもそも関数の戻り値として、DLLの呼び出し側に返信できるのか疑問。
42
-
43
-
44
-
45
- C#の使い方としては、もっとスマートな方法は無いものでしょうか?
46
10
 
47
11
 
48
12
 
@@ -97,3 +61,49 @@
97
61
  }
98
62
 
99
63
  ```
64
+
65
+
66
+
67
+ リストを見ると、コールバック関数を使っているのですが、
68
+
69
+ main関数の戻り値は、常にBOOLしか戻ってこない状態で、
70
+
71
+ 取得したいハンドル名を、WINDOWSコンソールに吐き出されています。
72
+
73
+
74
+
75
+ #知りたいこと
76
+
77
+
78
+
79
+ 最終的にはDLLとして、配列変数にして戻したいと思っています。
80
+
81
+
82
+
83
+ 方法としては
84
+
85
+
86
+
87
+ 1)コンソールの出力をテキストにして戻す
88
+
89
+  → DLLを呼ぶ側に解読するソースをつけないと行けないので、不細工です。
90
+
91
+
92
+
93
+ 2)メインの外にグローバル配列変数を作る
94
+
95
+  → そもそも関数の戻り値として、DLLの呼び出し側に返信できるのか疑問。
96
+
97
+
98
+
99
+ C#の使い方としては、もっとスマートな方法は無いものでしょうか?
100
+
101
+
102
+
103
+ 他の言語では、
104
+
105
+ サンプル: "列挙(コールバック)時の情報を列挙後へ渡す"
106
+
107
+ の例がありましたが、C#のソースがあれば紹介いただきたいです。
108
+
109
+ [リンク内容](http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/01094.html)