我在python脚本中使用ctypes lib时遇到了麻烦。这是我的代码(在互联网上找到):
if __name__ == "__main__":
from ctypes import *
user32 = windll.user32
kernel32 = windll.kernel32
class RECT(Structure):
_fields_ = [
("left", c_ulong),
("top", c_ulong),
("right", c_ulong),
("bottom", c_ulong)];
class GUITHREADINFO(Structure):
_fields_ = [
("cbSize", c_ulong),
("flags", c_ulong),
("hwndActive", c_ulong),
("hwndFocus", c_ulong),
("hwndCapture", c_ulong),
("hwndMenuOwner", c_ulong),
("hwndMoveSize", c_ulong),
("hwndCaret", c_ulong),
("rcCaret", RECT)
]
def moveCursorInCurrentWindow(x, y):
# Find the focussed window.
guiThreadInfo = GUITHREADINFO(cbSize=sizeof(GUITHREADINFO))
user32.GetGUIThreadInfo(0, byref(guiThreadInfo))
focussedWindow = guiThreadInfo.hwndFocus
# Find the screen position of the window.
windowRect = RECT()
user32.GetWindowRect(focussedWindow, byref(windowRect))
# Finally, move the cursor relative to the window.
user32.SetCursorPos(windowRect.left + x, windowRect.top + y)
if __name__ == '__main__':
# Quick test.
moveCursorInCurrentWindow(100, 100)
第一个问题是python无法找到ctypes所以我将从项目站点下载的文件复制到
netbeans\6.9\jython-2.5.1\Lib\
(是的,我正在使用netbeans)然后它显示了这个错误:
> from ctypes import *
> File "C:\Users\k\.netbeans\6.9\jython-2.5.1\Lib\ctypes\__init__.py", line 10, in <module>
> from _ctypes import Union, Structure, Array
就像init文件有一些错误o_O帮助家伙! 问候,克里斯
答案 0 :(得分:8)
ctypes
并未完成。
来自标题为“ctypes in Jython”的线程中的jython-users邮件列表,Jim Baker(一名Jython提交者)于2010年11月17日写道:
然后他建议这些工作:有一些实验支持 2.5.2 [当前版本]中的ctypes,但实际上更多 此时占位符。
如果您可以修改,我建议您使用JNA 你的ctypes代码。 JNA非常接近 对ctypes - JNA的API显然是 受到ctypes的显着影响! JNA似乎也很好用 Jython的。
另一种选择是使用某些东西 喜欢execnet。对于execnet 特别是:它允许你配对 使用CPython进行Jython,看起来确实如此 工作得很好但它的GPL许可证 使它成为许多人的首选 人。还有其他选择 那里也是。
在同一主题中,我们进行了这一确认评估:
我在2.5.2rc2中尝试了ctypes模块 最近,发现:1)有 还没有ctypes.util.find_library 2) ctypes.Structure不支持 非标量类型
所以我同意“更多的一个 占位符“评估。但仍然是 很高兴看到它开始。
答案 1 :(得分:3)
答案 2 :(得分:1)
Jython尚未完全支持ctypes:http://bugs.jython.org/issue1328
你不能简单地为CPython编译ctypes库,并将其插入Jython。
答案 3 :(得分:0)
好的,老兄!我只是重新配置我的NetBeans,现在它使用cPython。一切正常。我只是改变了界限
user32.SetCursorPos(windowRect.left + x, windowRect.top + y)
:
user32.SetCursorPos(c_ulong(windowRect.left + x), c_ulong(windowRect.left + y))