如何控制鼠标和键盘?

如何控制鼠标和键盘?

python在windows下有什么模块可以控制鼠标和键盘吗?
想写个程序自动控制鼠标和键盘完成任务
谢谢
找到了...

[Copy to clipboard] [ - ]
CODE:
>>> from ctypes import *
>>> windll.user32.SetCursorPos(100, 100)

楼上搞定了没?
搞定了几个东西
1,取得鼠标位置,get_mpos()
2,移动鼠标,set_mpos()
3,鼠标左键点击,move_click()
4,键盘输入(部分搞定,那个scancode还不明白是啥意思,为什么0x99输出的是字符'p'???)
代码如下

[Copy to clipboard] [ - ]
CODE:
from ctypes import *
import time

#<some pos>
win_start = (9, 753)
close_window = (1017, 4)
#</some pos>

PUL = POINTER(c_ulong)
class KeyBdInput(Structure):
        _fields_ = [("wVk", c_ushort),("wScan", c_ushort),("dwFlags", c_ulong),("time", c_ulong),("dwExtraInfo", PUL)]

class HardwareInput(Structure):
        _fields_ = [("uMsg", c_ulong),("wParamL", c_short),("wParamH", c_ushort)]

class MouseInput(Structure):
        _fields_ = [("dx", c_long),("dy", c_long),("mouseData", c_ulong),("dwFlags", c_ulong),("time",c_ulong),("dwExtraInfo", PUL)]

class Input_I(Union):
        _fields_ = [("ki", KeyBdInput),("mi", MouseInput),("hi", HardwareInput)]

class Input(Structure):
        _fields_ = [("type", c_ulong),("ii", Input_I)]

class POINT(Structure):
        _fields_ = [("x", c_ulong),("y", c_ulong)]

#<Get Pos>
def get_mpos():
        orig = POINT()
        windll.user32.GetCursorPos(byref(orig))
        return int(orig.x), int(orig.y)
#</Get Pos>

#<Set Pos>
def set_mpos(pos):
        x,y = pos
        windll.user32.SetCursorPos(x, y)
#</Set Pos>

#<move and click>
def move_click(pos, move_back = False):
        origx, origy = get_mpos()
        set_mpos(pos)
        FInputs = Input * 2
        extra = c_ulong(0)
        ii_ = Input_I()
        ii_.mi = MouseInput( 0, 0, 0, 2, 0, pointer(extra) )
        ii2_ = Input_I()
        ii2_.mi = MouseInput( 0, 0, 0, 4, 0, pointer(extra) )
        x = FInputs( ( 0, ii_ ), ( 0, ii2_ ) )
        windll.user32.SendInput(2, pointer(x), sizeof(x[0]))
        if move_back:
                set_mpos((origx, origy))
        return origx, origy
#</move and click>


def sendkey(scancode, pressed):
        FInputs = Input * 1
        extra = c_ulong(0)
        ii_ = Input_I()
        flag = 0x8 # KEY_SCANCODE
        ii_.ki = KeyBdInput( 0, 0, flag, 0, pointer(extra) )
        InputBox = FInputs( ( 1, ii_ ) )
       
        if scancode == None:
                return
        InputBox[0].ii.ki.wScan = scancode
        InputBox[0].ii.ki.dwFlags = 0x8  # KEY_SCANCODE  
        if not(pressed):
                InputBox[0].ii.ki.dwFlags |= 0x2 # released
        windll.user32.SendInput(1, pointer(InputBox), sizeof(InputBox[0]))
        if pressed:
                print "%x pressed" % scancode
        else:
                print "%x released" % scancode

if __name__ == '__main__':
        origx, origy = get_mpos()
        print 'Orig Pos:', origx, origy
        #set_mpos(9, 753)
        #move_click(win_start)
        move_click((800,600))
        time.sleep(1)
        sendkey(0x99,1)
        #keyboard_input()
       
        #set_mpos(origx, origy)

哦,原来是这个思路啊。不知道 Perl Win32::GuiTest 的那种思路在 Python 中有对应的实现吗?借鉴一下。
看看我每天都要用的一个小脚本(自动开启虚拟机):

[Copy to clipboard] [ - ]
CODE:
use Win32::GuiTest qw(:ALL);

our $timeoutFlag = 0;
$SIG{'__DIE__'} = sub{ print "$_[0]按回车键退出"; <> };

my $VMPath = shift || die "用法:$0 <VirtualMachine Path> <VM Name>\n";
my $VMName = shift || die "用法:$0 <VirtualMachine Path> <VM Name>\n";
my $OpenPietty = shift;

die "文件 $VMPath 不存在。\n" unless -f $VMPath;

`start $VMPath`;

my $desktop = GetDesktopWindow();

my ($win) = WaitWindowLike( $desktop, "$VMName - VMware Workstation", '^VMUIFrame$', undef, undef, 10 );

die "没有找到虚拟机窗口。请检查虚拟机名称是否的确是: [$VMName].\n" unless $win;

SetForegroundWindow($win);
SendKeys( '%mpp' );

sleep(3);

ShowWindow( $win, 0 );

exec('pietty') if $OpenPietty;

exit(0);

用法:

[Copy to clipboard] [ - ]
CODE:
D:\MoChou\perl\StartVMware.pl F:\Debian\Debian.vmx Debian yes

貌似很好用的样子...
郁闷python咋就没有


QUOTE:
原帖由 bleem1998 于 2007-4-19 10:56 发表
貌似很好用的样子...
郁闷python咋就没有

应该也有吧。
这些都是 windows 提供的功能了。
如果没有的话,那你给写一个不就得了。
键盘的基本搞定了
不过只能输入UNICODE的字符
接下来弄屏幕窗口的
类似WaitWindowLike()和GetDesktopWindow()
干巴爹~~干巴爹~~
有个东西叫AutoIt
用来自动完成工作很不错
脚本还可以编译成exe
放到任何机器上都可以跑
什么都不依赖
貌似不开源


QUOTE:
原帖由 bleem1998 于 2007-4-20 13:29 发表
有个东西叫AutoIt
用来自动完成工作很不错
脚本还可以编译成exe
放到任何机器上都可以跑
什么都不依赖
貌似不开源

WinRun?
呵呵,其实要找开源的还不如用 Perl。
也可以编译。