【问题标题】:python ctypes.WinDLL usage works but no resultpython ctypes.WinDLL 使用有效但没有结果
【发布时间】:2017-07-25 14:42:27
【问题描述】:

试图使用 win dll 来操作打开的窗口。

import ctypes
user32 = ctypes.WinDLL ("user32")
print(user32.FindWindowExA(None,None,None,"FileZilla"))

它打印 0 但 FileZilla 现在正在运行。 同一个库在 Java 中与 Native.loadLibrary 一起工作。 Lib 似乎已加载,因为它在使用错误数量的 args 调用 FindWindowExA 时打印错误。

【问题讨论】:

    标签: python winapi dll


    【解决方案1】:

    该代码可以在 32 位 Python 下运行,但不能在 64 位 Python 下运行。原因是您需要定义参数的类型。在 32 位进程中不这样做是靠运气而不是设计。

    此外,在我看来,将自己限制在 ANSI 接口似乎没有什么意义。你不妨养成使用 Win32 原生 Unicode 接口的习惯。

    所有这些都导致了这一点:

    import ctypes
    from ctypes import wintypes
    
    user32 = ctypes.WinDLL("user32")
    user32.FindWindowExW.restype = wintypes.HWND
    user32.FindWindowExW.argtypes = [wintypes.HWND, wintypes.HWND, wintypes.LPCWSTR, 
        wintypes.LPCWSTR]
    print(user32.FindWindowExW(None, None, None, "FileZilla"))
    

    【讨论】:

    • 谢谢!这行得通。但。首先,我注意到您使用 FindWindowExW(有效)而不是 FindWindowExA(无效)- 有什么区别?其次,这不起作用,假设应该关闭找到的窗口: user32.CloseWindow(user32.FindWindowExW(None,None,None,"FileZilla"))
    • CloseWindow 只会成功最小化。现在找到了DestroyWindow函数但是没有效果
    • 我解释了为什么我在答案中使用了 W 函数。我不会尝试回答您现在在 cmets 中提出的其他问题。我回答了你问的问题。如果这不能满足您的要求,我很抱歉。
    • 很抱歉我的粗心大意,你帮了我很多!我将在新线程中提出更多问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2013-10-25
    • 1970-01-01
    • 2016-10-06
    • 2017-02-22
    • 2013-06-19
    • 1970-01-01
    相关资源
    最近更新 更多