不依賴 MFC、VCL 等框架,直接使用 Win32 API 建立可接收檔案拖放(Drag & Drop)的視窗。核心在於 WM_CREATE 註冊 DragAcceptFiles、處理 WM_DROPFILES 訊息、以 DragQueryFile/DragQueryPoint 取得檔案清單與滑鼠座標、最後 DragFinish 釋放資源。
// 視窗類別註冊
WNDCLASS wc = {0};
wc.lpfnWndProc = MainWndProc;
wc.lpszClassName = "DropFileClass";
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
RegisterClass(&wc);
// 建立視窗
HWND hWnd = CreateWindowEx(0, "DropFileClass", "DropFile Demo", WS_OVERLAPPEDWINDOW, ...);
// 訊息迴圈
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CREATE:
DragAcceptFiles(hWnd, TRUE); // 啟用拖放
break;
case WM_DROPFILES: {
HDROP hDrop = (HDROP)wParam;
HDC hDC = GetDC(hWnd);
ShowFileInfo(hWnd, hDC, hDrop); // 自訂顯示函數
DragFinish(hDrop); // 必須呼叫釋放
ReleaseDC(hWnd, hDC);
break;
}
case WM_DESTROY:
DragAcceptFiles(hWnd, FALSE);
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
ShowFileInfoDragQueryPoint 取得放下位置。DragQueryFile(hDrop, 0xFFFFFFFF, ...) 取得檔案總數。DragQueryFile(hDrop, 0, path, ...) 取得路徑,配合 SHGetFileInfo 取得顯示名稱、類型名稱、圖示(ExtractIcon),在視窗客戶區繪製(TextOut/DrawIcon)。此範例展示最基礎的 Shell 拖放介面用法,可作為檔案接收工具、上傳元件、安裝程式拖放安裝等功能的起點。