打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python

http://blog.csdn.net/fangkailove/article/details/7614492

因为特殊需要, 想找一套能简单发送键盘消息,模拟键盘操作的模块。  类似于 C#.net  或 VB  的  sendKeys  函数。

找了很久没有合适的。 参考了一些网上的资料,使用windows API   SendInput 自已重新写了一个。


SendKeys2.py

  1 #!/usr/bin/python  2 # -*- coding: gbk -*-  3   4 # SendKeys2.py  5 #  6 # Copyright (C) 2012 - xulong <fangkailove@gmail.com>  7 #  8 from ctypes import *  9 import time 10 import win32con 11 import win32api 12 import win32ui 13  14 #Structure for a keycode input 15 class KeyBdInput(Structure): 16     _fields_ = [ 17             ("wVk",c_ushort), 18             ("wScan",c_ushort), 19             ("dwFlags",c_ulong), 20             ("time",c_ulong), 21             ("dwExtraInfo",POINTER(c_ulong)) 22             ] 23 #dwFlags can be certain combinations of the following values 24 KEYEVENTF_EXTENDEDKEY = 0x0001  #If specified, the scan code was preceded by a prefix byte that has the value 0xE0 (224). 25 KEYEVENTF_KEYUP = 0x0002  #If specified, the key is being released. If not specified, #the key is being pressed. 26 KEYEVENTF_SCANCODE = 0x0008 #If specified, wScan identifies the key and wVk is ignored.  27 KEYEVENTF_UNICODE = 0x0004  #If specified, the system synthesizes a VK_PACKET keystroke. The wVk parameter must be zero. This flag can only be combined with the KEYEVENTF_KEYUP flag. 28  29  30 #remark: 31 #dwFalgs default set 0 . 32 #when  1 >= keycode <= 254  set wVk = keycode and set wScan = 0 33 #when  keycode>254(unicode) set wScan = keycode and set wVk = 0  34 #      and set dwFlags |= KEYEVENTF_UNICODE  35 #  36 class HardwareInput(Structure): 37         _fields_ = [("uMsg", c_ulong),("wParamL", c_short),("wParamH", c_ushort)] 38  39 class MouseInput(Structure): 40         _fields_ = [("dx", c_long),("dy", c_long),("mouseData", c_ulong),("dwFlags", c_ulong),("time",c_ulong),("dwExtraInfo", POINTER(c_ulong))] 41  42 class Union_Input(Union): 43         _fields_ = [("ki", KeyBdInput),("mi", MouseInput),("hi", HardwareInput)] 44  45 class Input(Structure): 46     _fields_=[ 47             ("type",c_ulong), 48             ("ui",Union_Input) 49             ] 50 #type can be one of the following value 51 INPUT_MOUSE = 0  #The event is a mouse event. Use the mi structure of the union. 52 INPUT_KEYBOARD = 1 #The event is a keyboard event. Use the ki structure of the union. 53 INPUT_HARDWARE = 2 #The event is a hardware event. Use the hi structure of the union. 54  55  56  57  58 def send_key_event(keyCode,isKeyup): 59  60     Inputs = Input * 1 61     inputs = Inputs() 62  63     inputs[0].type = INPUT_KEYBOARD 64     inputs[0].ui.ki.wVk = keyCode 65     if isKeyup == True: 66         inputs[0].ui.ki.dwFlags = KEYEVENTF_KEYUP 67     windll.user32.SendInput(1, pointer(inputs), sizeof(inputs[0])) 68     win32api.Sleep(3) 69  70 def KeyDown(keyCode): 71     send_key_event(keyCode,False) 72  73 def KeyUp(keyCode): 74     send_key_event(keyCode,True) 75  76  77 #char in 1~255 key press 78 def KeyPress(keyCode,isShift): 79     if isShift == True: 80         send_key_event(win32con.VK_SHIFT,False) 81     send_key_event(keyCode,False) 82     send_key_event(keyCode,True) 83     if isShift == True: 84         send_key_event(win32con.VK_SHIFT,True) 85  86  87 #unicode char key press 88 def UniKeyPress(keyCode): 89     Inputs = Input * 2 90     inputs = Inputs() 91  92     inputs[0].type = INPUT_KEYBOARD 93     inputs[0].ui.ki.wVk = 0 94     inputs[0].ui.ki.wScan = keyCode 95     inputs[0].ui.ki.dwFlags = KEYEVENTF_UNICODE 96  97     inputs[1].type = INPUT_KEYBOARD 98     inputs[1].ui.ki.wVk = 0 99     inputs[1].ui.ki.wScan = keyCode100     inputs[1].ui.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP101     windll.user32.SendInput(2, pointer(inputs), sizeof(inputs[0]))102     win32api.Sleep(5)103 104 def SendString(Keys):105     for c in Keys:106         cC = ord(c)107         if cC>=0 and cC<256:108             vk = win32api.VkKeyScan(c)109             if vk == -1:110                 UniKeyPress(cC)111                 #print cC112             else:113                 if vk < 0:114                     vk = ~vk + 0x1115                 shift = ( vk >> 8 & 0x1  == 0x1 )116                 if win32api.GetKeyState(win32con.VK_CAPITAL) & 0x1 == 0x1:117                     if ( c >= 'a' and c <= 'z' ) or ( c >= 'A' and c <= 'Z' ):118                         shift = not shift119                 KeyPress(vk & 0xFF , shift)120         else:121             UniKeyPress(cC)122             #print cC123 124 125 126 127 128 129 130 if __name__ == '__main__':131     pass;

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VC知识库BLOG-紫罗兰茶馆-玩转keybd_event
鼠标、键盘模拟技术
鼠标坏了!其实键盘也是鼠标
SendInput模拟键盘输入的问题 <转>
用Delphi模拟键盘输入/鼠标点击 - xiaoma的日志 - 网易博客
Android自动化测试初探(四): 模拟键盘鼠标事件(Socket+Instrumentation实现)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服