gpt4 book ai didi

go - 如何在go中调用user32.dll的EnumDisplaySettingsA

转载 作者:行者123 更新时间:2023-12-01 22:21:02 25 4
gpt4 key购买 nike

我正在尝试通过Win32 API获取显示信息。到目前为止,我已经很好地管理了EnumDisplayDevicesA,但是EnumDisplaySettingsA给我带来了麻烦。
不管我如何设置前两个变量,该函数都将返回零(指示失败),并且没有关于失败原因的额外信息。
这是我的代码的简化版本,其中仅包含相关功能;

package main

import (
"fmt"
"syscall"
"unsafe"
)

var (
dll = syscall.MustLoadDLL("user32.dll")
enumDisplaySettings = dll.MustFindProc("EnumDisplaySettingsA")
)

type devMode struct {
dmDeviceName [32]uint16
dmSpecVersion uint16
dmDriverVersion uint16
dmSize uint16
dmDriverExtra uint16
dmFields uint32
dmOrientation int16
dmPaperSize int16
dmPaperLength int16
dmPaperWidth int16
dmScale int16
dmCopies int16
dmDefaultSource int16
dmPrintQuality int16
dmColor int16
dmDuplex int16
dmYResolution int16
dmTTOption int16
dmCollate int16
dmFormName [32]uint16
dmLogPixels uint16
dmBitsPerPel uint32
dmPelsWidth uint32
dmPelsHeight uint32
dmDisplayFlags uint32
dmDisplayFrequency uint32
dmICMMethod uint32
dmICMIntent uint32
dmMediaType uint32
dmDitherType uint32
dmReserved1 uint32
dmReserved2 uint32
dmPanningWidth uint32
dmPanningHeight uint32
}

func queryDisplaySettings() devMode {
out := devMode{}
out.dmSize = uint16(unsafe.Sizeof(out))
outptr := uintptr(unsafe.Pointer(&out))

namePtr := uintptr(unsafe.Pointer(nil))

var iModeNum uint32 = 4294967295
enumCurrentSettings := uintptr(unsafe.Pointer(&iModeNum))

ret, _, _ := enumDisplaySettings.Call(namePtr, enumCurrentSettings, outptr)
if ret == 0 {
fmt.Printf("Failed EnumDisplaySettings")
}
return out
}

func main() {
settings := queryDisplaySettings()

fmt.Printf("\n%v\n", settings.dmPelsWidth)
fmt.Printf("%v\n", settings.dmPelsHeight)
fmt.Printf("%v\n\n", settings.dmDisplayFrequency)
}

我的资料来源:
  • https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumdisplaysettingsw
  • https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-devmodea
  • https://github.com/JamesHovious/w32/blob/74b38b9b07b520e0f84a5eec5daada6c7b6a2471/typedef.go#L363
  • https://docs.rs/winapi/0.2.0/i686-pc-windows-msvc/winapi/constant.ENUM_CURRENT_SETTINGS.html
  • 最佳答案

    这里的代码有多个问题。
    首先,devMode的类型定义是针对DEVMODEW的,但您正在调用EnumDisplaySettingsA。但是,您不应该首先调用它(它是ANSI版本),所以请改用EnumDisplaySettingsW(UNICODE)。
    接下来,EnumDisplaySettingsA / EnumDisplaySettingsW的第二个参数是DWORD(uint32),但是,您没有传递值,而是将地址传递给了它。
    所以更换

    var iModeNum uint32 = 4294967295
    enumCurrentSettings := uintptr(unsafe.Pointer(&iModeNum))
    只要
    iModeNum := uintptr(4294967295)
    它应该都可以正常工作。

    关于go - 如何在go中调用user32.dll的EnumDisplaySettingsA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63570600/

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