#include #include #include #include "_cgo_export.h" #define droppedFilePathSize 32767 HHOOK nextHook; uint32_t nextDropID = 0; LRESULT CALLBACK DragAndDropHook( _In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam) { if (nCode < 0 || wParam == 0) return CallNextHookEx(nextHook, nCode, wParam, lParam); LPMSG message = (LPMSG)lParam; switch (message->message) { case WM_DROPFILES: { wchar_t droppedFilePath[droppedFilePathSize]; uint32_t dropID = nextDropID++; HDROP drop = (HDROP)message->wParam; POINT position; DragQueryPoint(drop, &position); droppedFilesPosition(dropID, position.x, position.y); UINT numberOfFiles = DragQueryFile(drop, 0xFFFFFFFF, NULL, 0); for (UINT fileIndex = 0; fileIndex < numberOfFiles; fileIndex++) { UINT length = DragQueryFileW(drop, fileIndex, droppedFilePath, droppedFilePathSize); droppedFilesFile(dropID, &droppedFilePath[0], length); } droppedFilesDrop(dropID); } break; } return CallNextHookEx(nextHook, nCode, wParam, lParam); } void SetDragAndDropHook(void *window) { HWND windowHandle = (HWND)window; DragAcceptFiles(windowHandle, TRUE); DWORD threadId = GetWindowThreadProcessId(windowHandle, NULL); nextHook = SetWindowsHookEx(WH_GETMESSAGE, DragAndDropHook, NULL, threadId); }