前提・実現したいこと
表題の通り、エクスプローラから他のアプリへファイルがドラッグされたのを検知したいです。
例: Google ChromeにC:\users\user\picture\pic.png
がドロップされました。
のような具合です。
発生している問題・エラーメッセージ
- そもそもコードの書き方を見つけられない。
- 「グローバルマウスフック」なるものを用いれば良い、と分かったが、
MouseDownやMouseUpなどのイベントは検知できても、DragEnterなどは難しい。
試したこと
Googleで「C# グローバル マウス フック ドラッグ ファイル」等のワードで検索しましたが、有力な情報が得られませんでした。
得られた情報でコードを書いてみましたが、
すべて「クリックを検知するにはどうしたら良いか」「座標を取得するにはどうしたら良いか」というものしか見つけられませんでした。
例えば、
C#
1public class MOUSEHOOKSTRUCT 2{ 3 public POINT pt; 4 public int hwnd; 5 public int wHitTestCode; 6 public int dwExtraInfo; 7}
のように、場所やウィンドウの情報しか得られないように思え、dragFileや、dataなどのプロパティが見当らなく断念しました。
実際に参考にしたサイト:
https://stackoverflow.com/questions/29016687/hook-drag-and-drop-of-windows-explorer-with-c
https://stackoverflow.com/questions/1746380/detect-drag-and-drop-operations-in-an-external-application-using-net
https://www.ipentec.com/document/csharp-get-mouse-pointer-screen-position-using-global-hook
https://qiita.com/kob58im/items/df01765c5059f725174c
補足情報(FW/ツールのバージョンなど)
.NET 3.1
Windows 10 Home
ご存じの方、ご教授いただけると嬉しいです。
radianさんのご提案で試したこと
下の様なDLL(ファイルがドロップされた時に、ビープを鳴らすDLL)を書いてみました。
c++
1// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。 2#include "pch.h" 3#define Ex __declspec(dllexport) 4#include <windows.h> 5extern "C" { 6 Ex void CALLBACK sethook(void); 7 Ex void CALLBACK freehook(void); 8} 9#pragma data_seg(".sharedata") 10HHOOK hHookWnd = 0; 11#pragma data_seg() 12HINSTANCE hdll; 13BOOL APIENTRY DllMain( HINSTANCE hInstance, 14 DWORD ul_reason_for_call, 15 LPVOID lpReserved ) { 16 (void)lpReserved; 17 switch (ul_reason_for_call) 18 { 19 case DLL_PROCESS_ATTACH: 20 hdll = hInstance; 21 case DLL_THREAD_ATTACH: 22 case DLL_THREAD_DETACH: 23 case DLL_PROCESS_DETACH: 24 break; 25 } 26 return TRUE; 27} 28 29LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) { 30 if (nCode == HC_ACTION) { 31 if (((CWPSTRUCT*)lParam)->message == WM_DROPFILES) { 32 //ファイルがドロップされた時! 33 MessageBeep(0xffffffff); 34 } 35 } 36 return CallNextHookEx(hHookWnd, nCode, wParam, lParam); 37} 38 39 40void CALLBACK sethook(void) { 41 hHookWnd = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, hdll, 0); 42} 43 44void CALLBACK freehook(void) { 45 UnhookWindowsHookEx(hHookWnd); 46}
defファイルは以下の通りです。
def
1LIBRARY 2SECTIONS 3 .sharedata READ WRITE SHARED
呼び出し元(C#)のコードはこちらです。
[DllImport(/*"DLLのファイル名"*/)] public static extern void sethook(); [DllImport(/*"DLLのファイル名"*/)] public static extern void freehook(); public MainWindow() { InitializeComponent(); sethook(); }
しかし、ファイルのドロップが検知されない状況です。
試したこと
WM_DROPFILESではなくWM_CREATEなど別のもので試す → ビープ音がなりました。
回答1件
あなたの回答
tips
プレビュー