首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python和C类型.放大DLL

Python和C类型.放大DLL
EN

Stack Overflow用户
提问于 2018-04-19 18:17:39
回答 1查看 1.7K关注 0票数 1

我的目标是从运行在Python3.6中的magnification.dll中获得。我可以放大屏幕,但我无法使输入的转换工作。我希望有人知道如何解决这个问题,并能解释我做错了什么。谢谢。( 放大API (Windows)

附注:可能会发生这样的情况:您需要手动关闭python进程,因为缩放不会停止。(至少在代码中)

magnification_api.py

代码语言:javascript
复制
import ctypes

class RECT(ctypes.Structure):
    _fields_ = [("left", ctypes.c_long),
                ("top", ctypes.c_long),
                ("right", ctypes.c_long),
                ("bottom", ctypes.c_long)]

class Magnification:
    def __init__(self):
        self.dll = ctypes.CDLL("magnification.dll")

        BOOL = ctypes.c_bool
        FLOAT = ctypes.c_float
        INT = ctypes.c_int
        self.LPRECT = LPRECT = ctypes.POINTER(RECT)
        self.PBOOL = PBOOL = ctypes.POINTER(ctypes.c_bool)

        # MagInitialize
        self.dll.MagInitialize.restype = BOOL

        # MagUninitialize 
        self.dll.MagUninitialize.restype = BOOL

        # MagSetFullscreenTransform 
        self.dll.MagSetFullscreenTransform.restype = BOOL
        self.dll.MagSetFullscreenTransform.argtypes = (FLOAT, INT, INT)

        # MagGetInputTransform 
        self.dll.MagGetInputTransform.restype = BOOL
        self.dll.MagGetInputTransform.argtypes = (PBOOL, LPRECT, LPRECT)

    def MagInitialize(self):
        return self.dll.MagInitialize()

    def MagUninitialize(self):
        return self.dll.MagUninitialize()

    def MagSetFullscreenTransform(self, magLevel, xOffset, yOffset):
        return self.dll.MagSetFullscreenTransform(magLevel, xOffset, yOffset)

    def MagGetInputTransform(self, pfEnabled, prcSource, prcDest):
        return self.dll.MagGetInputTransform(pfEnabled, prcSource, prcDest)

zoomer.py

代码语言:javascript
复制
import ctypes
from magnification_api import Magnification
import time

class Main:
    def __init__(self):
        self.mag = Magnification()

    def zoom(self, factor, x, y):
        if factor > 1.0:
            while True:
                if self.mag.MagInitialize():
                    result = self.mag.MagSetFullscreenTransform(factor, 0, 0)

                    if result:    
                        fInputTransformEnabled = self.mag.PBOOL()
                        rcInputTransformSource = self.mag.LPRECT()
                        rcInputTransformDest = self.mag.LPRECT()

                        if self.mag.MagGetInputTransform(fInputTransformEnabled, rcInputTransformSource, rcInputTransformDest):
                        # fails here
                            print("Success")
                        else:
                            print("Failed")

                time.sleep(1)


if __name__ == "__main__":
    m = Main()
    m.zoom(1.05, 0, 0)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-19 21:35:41

首先,我要指出代码中不正确的其他内容(不一定与错误相关):

  • 好像重新发明了方向盘。使用wintype模块(仅在文档中提到),它具备此场景所需的一切:从>>> dir(Wintype) 'ATOM','BOOL',‘布尔’,‘字节’,'CHAR','COLORREF','DOUBLE','DWORD','FILETIME',‘浮子’,'HACCEL',‘句柄’,'HBITMAP','HBRUSH','HCOLORSPACE','HDC','HDESK','HDWP','HENHMETAFILE','HFONT','HGDIOBJ','HGLOBAL','HHOOK',‘H图标’,“‘HINSTANCE”、“HKEY”、“HKL”、“HLOCAL”、“HMENU”、“HMETAFILE”、“HMODULE”、“HMONITOR”、“HPALETTE”、“HPEN”、“HRGN”、“HRSRC”、“HSTR”、“HTASK”、“HWINSTA”、“HWND”、“INT”、“LANGID”、“大整数”、“INT”、“LCTYPE”、“LGRPID”、“LPARAM”、“LPBOOL”、“LPBYTE”、“LPOLESTR”、“LPCOLORREF”、“LPCSTR”、“LPCVOID”、“LPCWSTR”、“LPDWORD”、“LPFILETIME”、“LPHANDLE”、“LPHKL”、“LPINT”、“LPLONG”、“LPMSG”、“LPOLESTR”、“LPPOINT”、“LPRECT”、“LPRECTL”、“LPSC_HANDLE”、“LPSIZE”、“LPSIZEL”、“LPSTR”、“LPUINT”、“LPVOID”、“LDAIN32”“‘LPWORD”、“LPWSTR”、“MAX_PATH”、“MSG”、“OLESTR”、“PBOOL”、“PBOOLEAN”、“PBYTE”、“PCHAR”、“PDWORD”、“PFILETIME”、“PFLOAT”、“PHANDLE”、“PHKEY”、“PINT”、“PLARGE_IN整数”、“PLCID”、“PLONG”、“PMSG”、“POINT”、“POINTL”、“PPOINT”、“PPOINT”、“PRECT”、“PRECTL”,“PUSHORT”、“PSIZE”、“PSIZEL”、“PSMALL_RECT”、“PUINT”、“PULARGE_PULONG”、“PULONG”、“PUSHORT”、“PWCHAR”、“PUINT 32_FIND_DATAA”、“PUINT 32_FIND_DATAW”、“PWORD”、“RECT”、“RECTL”、“RGB”、“SC_HANDLE”、“SERVICE_STATUS_句柄”、'SHORT‘、'SIZE’、'SIZEL‘、'SMALL_RECT’、'UINT‘、“ULARGE_VARIANT”、“ULONG”、“USHORT”、“VARIANT_BOOL”、'WCHAR‘、’FIND 32_FIND_DATAA‘、’FIND 32_FIND_DATAW‘、'WORD’、'WPARAM‘、'_COORD’、'_FILETIME‘、’_doc_POINTL‘、'_RECTL’、'_SMALL_RECT‘、’_ULARGE_整数‘、’__builtins_‘、’_cached__‘、’_doc_‘、__file_‘_’,__name_‘,__package_’,'__spec__',‘ctype’,'tagMSG','tagPOINT','tagRECT','tagSIZE‘

作为副词,BOOL的自定义定义与Win的定义不匹配:

ctypes.sizeof(ctypes.c_bool) 1 >>> ctypes.sizeof(wintypes.BOOL) 4

它是访问冲突的候选

回到错误:它是ERROR_INVALID_PARAMETER,因为传递给MagGetInputTransform的所有3个参数都是空指针,[Python 3]:指针声明:

在没有参数的情况下调用指针类型将创建一个NULL指针。

要修复它(这只是一种方法--我认为这是最直接的)更改:

  • 三个变量初始化: fInputTransformEnabled = wintypes.BOOL() rcInputTransformSource = wintypes.RECT() rcInputTransformDest = wintypes.RECT()
  • 它们被传递给MagGetInputTransform的方式: if self.mag.MagGetInputTransform(ctypes.byref(fInputTransformEnabled),ctypes.byref(rcInputTransformSource),ctypes.byref(rcInputTransformDest)):

而且一切都应该很好(不过,所有3个变量都已填充了__s)。

NB:当您在Win上遇到错误时,[MSDN: GetLastError函数](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.140%29.aspx)是您最好的朋友!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49927672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档