- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在使用 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/
当我的 Windows 应用程序(游戏)启动时,我注册它以接收原始输入消息: RAWINPUTDEVICE Rid[2]; Rid[0].usUsagePage = HID_USAGE_PAGE_G
我正在使用 https://github.com/lxn/win在 Go 中访问低级 Windows 调用的包。我正在调用 win.RegisterRawInputDevices 为原始输入数据注册设
我是一名优秀的程序员,十分优秀!