使用Python ctypes调用AutoIt DLL中的函数

Jos*_*osh 6 python windows autoit

我想调用AutoIt dll中的函数,我在C:\ Program Files(x86)\ AutoIt3\AutoItX\AutoItX3.dll中找到了使用Python的函数.我知道我可以使用,win32com.client.Dispatch("AutoItX3.Control")但我不能安装应用程序或在系统中注册任何东西.

到目前为止,这就是我所在的地方:

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

以下是有效的方法:

autoit.AU3_WinMinimizeAll() # windows were successfully minimized.
autoit.AU3_Sleep(1000) # sleeps 1 sec.
Run Code Online (Sandbox Code Playgroud)

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

autoit.AU3_WinGetHandle('Untitled - Notepad', '')
Run Code Online (Sandbox Code Playgroud)

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

autoit.AU3_WinClose('Untitled - Notepad', '')
Run Code Online (Sandbox Code Playgroud)

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

autoit.AU3_WinActivate('Untitled - Notepad', '')
Run Code Online (Sandbox Code Playgroud)

我用with测试了这些例子,Dispatch("AutoItX3.Control")一切都像预期的那样工作.

似乎应该返回除字符串以外的东西的方法正在崩溃python.但仍然,其他人WinClose甚至没有工作......

预先感谢您的帮助!

编辑:

使用unicode字符串时,这些方法现在正在工作:

autoit.AU3_WinClose(u'Untitled - Notepad', u'')
autoit.AU3_WinActivate(u'Untitled - Notepad', u'')
Run Code Online (Sandbox Code Playgroud)

我找到了原型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'!
Run Code Online (Sandbox Code Playgroud)

谢谢那些帮助过我的人!

aba*_*ert 4

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

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

例如,假设该函数如下所示(只是随机猜测!):

void AU3_WinClose(LPCWSTR name, LPCWSTR someotherthing);
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

autoit.AU3_WinClose.argtypes = (LPCWSTR, LPCWSTR)
autoit.AU3_WinClose.restype = None
Run Code Online (Sandbox Code Playgroud)

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

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