0

我正在为游戏创建脚本,因为我想自动化其中的某个部分。到目前为止,我有:

import win32api, win32con, time
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
click(100,655)
time.sleep(3)
click(740,580)
time.sleep(1)
raw_input(100) 

到目前为止,我点击了我需要去的正确页面,然后我点击了可以输入数字的文本框,但是在选择了文本框后,我不知道如何输入数字。我想使用 raw_input,但它的作用就像一个打印语句。

4

1 回答 1

1

raw_input功能不会模拟对另一个程序的击键。它将做的是将提示打印到它的控制台,等待您对该控制台输入响应,然后将您输入的内容返回到您的脚本。在这里完全没用。

您真正想要的是一种将键盘事件发送到应用程序的方法,就像您发送鼠标事件一样。


如果您可以依赖存在的 Windows 脚本主机(我认为在 Vista 和 XPSP3 及更高版本中始终存在,并且可以为早期的 XP 安装),您可以只使用它而不是在低级别执行操作:

wshell = win32com.client.Dispatch("WScript.Shell")
wshell.SendKeys("foo")

否则,您需要获取窗口句柄(在 win32api 文档中对此进行了解释,所以我假设您已经知道它)然后是这样的:

def sendkey(hwnd, keycode):
    win32api.PostMessage(hwnd, win32con.WM_CHAR, keycode, 0)

这不会正确处理制表符、转义或返回等特殊键。为此,您需要改为发送WM_KEYDOWNand WM_KEYUP。但为你所用,WM_CHAR就是你想要的。

您还需要一个函数来查找字符串中每个字符的键码。因为'100'它实际上只是ord('1'), ord('0'), ord('0'),但并非所有事情都是如此。


您可能想查看SendKeys为您包装所有这些的类似模块。

或者您可能想要使用更高级别的自动化库,例如AutoPy(其中有很多,如果您搜索 SO,您会找到所有这些的详细信息)。

或者您可能想忘记尝试根据鼠标单击和键事件来自动化浏览器,而是使用selenium.

或者您可能想忘记自动化浏览器,而只是在您自己的脚本中使用mechanize.

于 2013-07-11T19:16:15.080 回答