gpt4 book ai didi

go - win.RegisterRawInputDevices 总是返回 false

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:33 26 4
gpt4 key购买 nike

我正在使用 https://github.com/lxn/win在 Go 中访问低级 Windows 调用的包。我正在调用 win.RegisterRawInputDevices 为原始输入数据注册设备,但它始终返回 false。我在 C# 中完成此操作没有任何问题。下面是我的代码:

package main

import (
"fmt"
"syscall"
"unsafe"
"github.com/lxn/win"
)

func WndProc(hWnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr {
switch msg {
case win.WM_CREATE:
fmt.Println("Received WM_CREATE message")
devices := getRawInputDevices(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_DESTROY:
fmt.Println("Posting quit message")
win.PostQuitMessage(0)
default:
return win.DefWindowProc(hWnd, msg, wParam, lParam)
}

return 0
}

func getRawInputDevices(hWnd win.HWND) []win.RAWINPUTDEVICE {
devices := make([]win.RAWINPUTDEVICE, 5)
devices[0].UsUsagePage = 0x01
devices[0].UsUsage = 0x02
devices[0].DwFlags = win.RIDEV_INPUTSINK
devices[0].HwndTarget = hWnd
devices[1].UsUsagePage = 0x01
devices[1].UsUsage = 0x06
devices[1].DwFlags = win.RIDEV_INPUTSINK
devices[1].HwndTarget = hWnd
devices[2].UsUsagePage = 0x00
devices[2].UsUsage = 0x51
devices[2].DwFlags = win.RIDEV_INPUTSINK
devices[2].HwndTarget = hWnd
devices[3].UsUsagePage = 0x00
devices[3].UsUsage = 0x04
devices[3].DwFlags = win.RIDEV_INPUTSINK
devices[3].HwndTarget = hWnd
devices[4].UsUsagePage = 0x00
devices[4].UsUsage = 0x00
devices[4].DwFlags = win.RIDEV_INPUTSINK
devices[4].HwndTarget = hWnd
return devices
}

func WinMain() int {

hInstance := win.GetModuleHandle(syscall.StringToUTF16Ptr(""))
lpszClassName := syscall.StringToUTF16Ptr("WNDclass")
var wcex win.WNDCLASSEX
wcex.HInstance = hInstance
wcex.LpszClassName = lpszClassName
wcex.LpfnWndProc = syscall.NewCallback(WndProc)
wcex.CbSize = uint32(unsafe.Sizeof(wcex))
win.RegisterClassEx(&wcex)
win.CreateWindowEx(
0, lpszClassName, syscall.StringToUTF16Ptr("Simple Go 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 main() {
WinMain()
return
}

我收到了 WM_CREATE 消息,但是 win.RegisterRawInputDevices 总是返回 false 并显示“参数不正确”。错误。正如我所提到的,我已经在 C# 中毫无问题地完成了这项工作,因此我熟悉基本步骤。我是 Go 的新手,所以我可能会遗漏一些东西。有什么想法吗?

最佳答案

在研究了 Go 的结构对齐策略和各种其他底层内容后,我终于意识到我为 RAWINPUTDEVICE.UsUsagePage 设置了错误的值!元素 2、3 和 4 应将 UsUsagePage 设置为 0x0D 而不是 0x00!哦,好吧,至少我学到了很多关于 Go 如何将结构元素与单词边界对齐的知识!

关于go - win.RegisterRawInputDevices 总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53989406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com