怎样给已知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都没有触发
请问有接触过这方面的大佬没?希望指点一下