質問編集履歴

3

radianさんのご提案

2021/07/23 02:04

投稿

AsPulse
AsPulse

スコア35

test CHANGED
File without changes
test CHANGED
@@ -87,3 +87,151 @@
87
87
 
88
88
 
89
89
  ご存じの方、ご教授いただけると嬉しいです。
90
+
91
+
92
+
93
+ ## radianさんのご提案で試したこと
94
+
95
+ 下の様なDLL(ファイルがドロップされた時に、ビープを鳴らすDLL)を書いてみました。
96
+
97
+ ```c++
98
+
99
+ // dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。
100
+
101
+ #include "pch.h"
102
+
103
+ #define Ex __declspec(dllexport)
104
+
105
+ #include <windows.h>
106
+
107
+ extern "C" {
108
+
109
+ Ex void CALLBACK sethook(void);
110
+
111
+ Ex void CALLBACK freehook(void);
112
+
113
+ }
114
+
115
+ #pragma data_seg(".sharedata")
116
+
117
+ HHOOK hHookWnd = 0;
118
+
119
+ #pragma data_seg()
120
+
121
+ HINSTANCE hdll;
122
+
123
+ BOOL APIENTRY DllMain( HINSTANCE hInstance,
124
+
125
+ DWORD ul_reason_for_call,
126
+
127
+ LPVOID lpReserved ) {
128
+
129
+ (void)lpReserved;
130
+
131
+ switch (ul_reason_for_call)
132
+
133
+ {
134
+
135
+ case DLL_PROCESS_ATTACH:
136
+
137
+ hdll = hInstance;
138
+
139
+ case DLL_THREAD_ATTACH:
140
+
141
+ case DLL_THREAD_DETACH:
142
+
143
+ case DLL_PROCESS_DETACH:
144
+
145
+ break;
146
+
147
+ }
148
+
149
+ return TRUE;
150
+
151
+ }
152
+
153
+
154
+
155
+ LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
156
+
157
+ if (nCode == HC_ACTION) {
158
+
159
+ if (((CWPSTRUCT*)lParam)->message == WM_DROPFILES) {
160
+
161
+ //ファイルがドロップされた時!
162
+
163
+ MessageBeep(0xffffffff);
164
+
165
+ }
166
+
167
+ }
168
+
169
+ return CallNextHookEx(hHookWnd, nCode, wParam, lParam);
170
+
171
+ }
172
+
173
+
174
+
175
+
176
+
177
+ void CALLBACK sethook(void) {
178
+
179
+ hHookWnd = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, hdll, 0);
180
+
181
+ }
182
+
183
+
184
+
185
+ void CALLBACK freehook(void) {
186
+
187
+ UnhookWindowsHookEx(hHookWnd);
188
+
189
+ }
190
+
191
+ ```
192
+
193
+ defファイルは以下の通りです。
194
+
195
+ ```def
196
+
197
+ LIBRARY
198
+
199
+ SECTIONS
200
+
201
+ .sharedata READ WRITE SHARED
202
+
203
+ ```
204
+
205
+ 呼び出し元(C#)のコードはこちらです。
206
+
207
+ ```
208
+
209
+ [DllImport(/*"DLLのファイル名"*/)]
210
+
211
+ public static extern void sethook();
212
+
213
+ [DllImport(/*"DLLのファイル名"*/)]
214
+
215
+ public static extern void freehook();
216
+
217
+
218
+
219
+ public MainWindow()
220
+
221
+ {
222
+
223
+ InitializeComponent();
224
+
225
+ sethook();
226
+
227
+ }
228
+
229
+ ```
230
+
231
+ しかし、ファイルのドロップが検知されない状況です。
232
+
233
+ #### 試したこと
234
+
235
+
236
+
237
+ WM_DROPFILESではなくWM_CREATEなど別のもので試す → ビープ音がなりました。

2

参考にしたサイトの追加

2021/07/23 02:04

投稿

AsPulse
AsPulse

スコア35

test CHANGED
File without changes
test CHANGED
@@ -64,6 +64,18 @@
64
64
 
65
65
 
66
66
 
67
+ 実際に参考にしたサイト:
68
+
69
+ https://stackoverflow.com/questions/29016687/hook-drag-and-drop-of-windows-explorer-with-c
70
+
71
+ https://stackoverflow.com/questions/1746380/detect-drag-and-drop-operations-in-an-external-application-using-net
72
+
73
+ https://www.ipentec.com/document/csharp-get-mouse-pointer-screen-position-using-global-hook
74
+
75
+ https://qiita.com/kob58im/items/df01765c5059f725174c
76
+
77
+
78
+
67
79
  ### 補足情報(FW/ツールのバージョンなど)
68
80
 
69
81
 

1

試したことについての追加情報

2021/07/23 00:14

投稿

AsPulse
AsPulse

スコア35

test CHANGED
File without changes
test CHANGED
@@ -30,9 +30,37 @@
30
30
 
31
31
  ### 試したこと
32
32
 
33
+ Googleで「C# グローバル マウス フック ドラッグ ファイル」等のワードで検索しましたが、有力な情報が得られませんでした。
33
34
 
34
35
 
36
+
37
+ 得られた情報でコードを書いてみましたが、
38
+
35
- GoogleでC# グローバル マウス フック ドラッグ ファイル」等のワードでしたが、有力な情報が得られませんでした。
39
+ すべてクリック知するにはどうたら良いか」「座標を取得するにはどうしたら良いか」というものしか見つけられませんでした。
40
+
41
+ 例えば、
42
+
43
+ ```C#
44
+
45
+ public class MOUSEHOOKSTRUCT
46
+
47
+ {
48
+
49
+ public POINT pt;
50
+
51
+ public int hwnd;
52
+
53
+ public int wHitTestCode;
54
+
55
+ public int dwExtraInfo;
56
+
57
+ }
58
+
59
+ ```
60
+
61
+ のように、場所やウィンドウの情報しか得られないように思え、dragFileや、dataなどのプロパティが見当らなく断念しました。
62
+
63
+
36
64
 
37
65
 
38
66