6

我想从 AutoIt dll 调用函数,我使用 Python在C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll 找到了这些函数。我知道我可以使用win32com.client.Dispatch("AutoItX3.Control"),但我无法安装应用程序或在系统中注册任何内容。

到目前为止,这就是我所在的位置:

from ctypes import *
path = r"C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll"
autoit = windll.LoadLibrary(path)

以下是有效的方法:

autoit.AU3_WinMinimizeAll() # windows were successfully minimized.
autoit.AU3_Sleep(1000) # sleeps 1 sec.

这是我的问题,当我调用像这样的其他方法时,python 崩溃了。我得到python.exe 已停止从 Windows 工作...

autoit.AU3_WinGetHandle('Untitled - Notepad', '')

还有一些其他方法不会使 python 崩溃,但只是不起作用。这个不关闭窗口并返回 0:

autoit.AU3_WinClose('Untitled - Notepad', '')

而另一个返回 1 但窗口仍然最小化:

autoit.AU3_WinActivate('Untitled - Notepad', '')

我已经用 with 测试了这些示例,Dispatch("AutoItX3.Control")一切都按预期工作。

似乎应该返回字符串以外的其他内容的方法正在崩溃 python。但是,其他人WinClose甚至都没有工作......

预先感谢您的帮助!

编辑:

这些方法现在在使用 unicode 字符串时有效:

autoit.AU3_WinClose(u'Untitled - Notepad', u'')
autoit.AU3_WinActivate(u'Untitled - Notepad', u'')

我找到了原型AU3_WinGetHandle

AU3_API void WINAPI AU3_WinGetHandle(const char szTitle, / [in,defaultvalue("")]*/const char *szText, char *szRetText, int nBufSize);

现在我可以使用以下代码检索返回值!

from ctypes.wintypes import LPCWSTR
s = LPCWSTR(u'')
print AU3_WinGetHandle(u'Untitled - Notepad', u'', s, 100) # prints 1
print s.value # prints '000705E0'!

感谢那些帮助过我的人!

4

2 回答 2

4

它适用于 unicode 字符串吗?

autoit.AU3_WinClose(u'Untitled - Notepad', u'')

autoit.AU3_WinActivate(u'Untitled - Notepad', u'')

实际上,您可能必须显式创建 unicode 缓冲区,例如:

autoit.AU3_WinClose(create_unicode_buffer('Untitled - Notepad'), create_unicode_buffer(''))

通过一些谷歌搜索,它看起来AU3_WinGetHandle需要 4 个参数,而不是 2 个。所以你需要把它整理出来。

于 2013-11-13T02:31:24.900 回答
4

如果您有您尝试调用的函数的原型,那么我们可以帮助您调试调用而无需猜测。或者,更重要的是,我们不必帮助您调试调用,因为您可以让 ctypes 为您完成。

请参阅在文档中指定所需的参数类型。

例如,假设函数看起来像这样(只是随机猜测!):

void AU3_WinClose(LPCWSTR name, LPCWSTR someotherthing);

你可以这样做:

autoit.AU3_WinClose.argtypes = (LPCWSTR, LPCWSTR)
autoit.AU3_WinClose.restype = None

如果您这样做,ctypes 将尝试将您的参数转换为指定的类型(LPWSTR,它是指向用于 Windows UTF-16 字符串的宽字符的指针),如果不能,则引发异常,并且会不期望任何返回值。

如果你这样做,ctypes 将尝试猜测正确的东西来将你的参数转换为,可能会猜测错误,并将尝试将不存在的返回值解释为 int。因此,它通常会崩溃,直到您设法准确猜测要向它抛出的类型以使其猜测要传递给函数的正确类型。

于 2013-11-13T02:42:20.930 回答