WM_DROPFILES 如何正确使用?

怎样给已知Hwnd的窗口绑定消息,谷歌了几天, 案例都是用CreateWindowEx创建一个窗口来接受消息,但关于获取拖拽文件只查到DragQueryFile、DragAcceptFiles 等相关api,贴出的代码示例不是很完整,没能实现

GoLang源码:

package main

import (
    "fmt"
    "syscall"
    "unsafe"

    "github.com/lxn/win"
)

type WndProc func(hWnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr

var __Hwnd win.HWND

func StartWindowsMessageLoop(windowsMessageReceiver WndProc) int {
    hInstance := win.GetModuleHandle(syscall.StringToUTF16Ptr(""))
    lpszClassName := syscall.StringToUTF16Ptr("WNDclass")
    var wcex win.WNDCLASSEX
    wcex.HInstance = hInstance
    wcex.LpszClassName = lpszClassName
    wcex.LpfnWndProc = syscall.NewCallback(windowsMessageReceiver)
    wcex.CbSize = uint32(unsafe.Sizeof(wcex))
    win.RegisterClassEx(&wcex)
    win.CreateWindowEx(
        0, lpszClassName, syscall.StringToUTF16Ptr("Message Receiver Window"),
        win.WS_OVERLAPPEDWINDOW,
        win.CW_USEDEFAULT, win.CW_USEDEFAULT, 400, 400, 0, 0, hInstance, nil)

    var msg win.MSG
    for {
        if win.GetMessage(&msg, 0, 0, 0) == 0 {
            break
        }
        win.TranslateMessage(&msg)
        win.DispatchMessage(&msg)
    }
    return int(msg.WParam)
}

func GetRawInputDeviceMouseDefinition(hWnd win.HWND) []win.RAWINPUTDEVICE {
    devices := make([]win.RAWINPUTDEVICE, 1)
    devices[0].UsUsagePage = 0x01
    devices[0].UsUsage = 0x02
    devices[0].DwFlags = win.RIDEV_INPUTSINK
    devices[0].HwndTarget = hWnd
    return devices
}

func MakeMouseRawInputReceiver() WndProc {

    return func(hWnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
        // fmt.Println(msg, wParam, lParam, win.WM_LBUTTONDOWN)
        switch msg {
        case win.WM_CREATE:
            fmt.Println("WM_CREATE")
            devices := GetRawInputDeviceMouseDefinition(hWnd)
            len := uint32(len(devices))
            size := uint32(unsafe.Sizeof(devices[0]))
            if !win.RegisterRawInputDevices(&devices[0], len, size) {
                panic("Unable to register devices")
            }
        case win.WM_LBUTTONDOWN:
            fmt.Println("WM_LBUTTONDOWN")
        case win.WM_DROPFILES:
            fmt.Println("drag")

        case win.WM_DESTROY:
            fmt.Println("destroying window")
            win.PostQuitMessage(0)
        default:
            return win.DefWindowProc(hWnd, msg, wParam, lParam)
        }

        return 0
    }
}

func main() {
    StartWindowsMessageLoop(MakeMouseRawInputReceiver())
}

不太了解这方面,WM_LBUTTONDOWN、WM_DROPFILES都没有触发

请问有接触过这方面的大佬没?希望指点一下

阅读 750
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏