1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
# coding:cp1252
class Win32 :
import ctypes
KeyTable = {}
def __init__(self):
self.buffer = None
def BuildKeyTable (self):
VkToScan = lambda vk : self.ctypes.windll.user32.MapVirtualKeyA( vk,0 )
ScanToVk = lambda sc : self.ctypes.windll.user32.MapVirtualKeyA( sc,1 )
AsciiToVk = self.ctypes.windll.user32.VkKeyScanA
GetKeyName = self.ctypes.windll.user32.GetKeyNameTextA
if not self.buffer :
self.buffer = self.ctypes.create_string_buffer( 300 )
res = {} # dict[char/key name] = ( scan code , virtual key , shift , ctrl , alt )
for sc in xrange( 128 ):
GetKeyName( sc << 16,self.buffer,self.ctypes.sizeof( self.buffer ))
if len( self.buffer.value ) == 1 :
res[self.buffer.value] = (sc,ScanToVk( sc ),0,0,0)
for ascii in xrange( 32,256 ):
vk = AsciiToVk( ascii )
vk,shift,ctrl,alt = vk&0xff,(vk>>8)&1,(vk>>9)&1,(vk>>10)&1
res[chr(ascii)] = ( VkToScan( vk ),vk,shift,ctrl,alt )
# http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731
specials = 'back,tab,,,,enter,,,shift,ctrl,alt,pause,capital,,,,,,,escape,,,,,space,prior,next,end,home,left,up,right,down,,,,,insert,delete'
for name,vk in filter( lambda a : a[0] ,zip( specials.split(','),xrange( 8,1000 ))) :
res[name] = (VkToScan( vk ),vk,0,0,0)
return res
def GetForegroundWindowTitle (self):
if not self.buffer :
self.buffer = self.ctypes.create_string_buffer( 300 )
hwnd = self.ctypes.windll.user32.GetForegroundWindow()
self.ctypes.windll.user32.GetWindowTextA( hwnd,self.buffer,self.ctypes.sizeof( self.buffer ))
return self.buffer.value
def PressKey ( self,key ):
SubKeyPress = lambda sc,vk,down : self.ctypes.windll.user32.keybd_event( vk,sc,(3,1)[down],0 )
if not self.KeyTable :
self.KeyTable = self.BuildKeyTable()
down,up = True,True
if len( key ) > 1 :
if key.startswith('+') : key,up = key[1:],False
if key.startswith('-') : key,down = key[1:],False
if key in self.KeyTable :
scan,vk,shift,ctrl,alt = self.KeyTable[key]
print key,scan,vk,shift,ctrl,alt,down,up
if alt : self.PressKey('+alt')
if ctrl : self.PressKey('+ctrl')
if shift : self.PressKey('+shift')
if down : SubKeyPress( scan,vk,True )
if up : SubKeyPress( scan,vk,False )
if shift : self.PressKey('-shift')
if ctrl : self.PressKey('-ctrl')
if alt : self.PressKey('-alt')
def PressKeys ( *keys ):
w = Win32()
import time
for k in keys :
if k.startswith('sleep'):
time.sleep( float( k[5:] ))
elif len( k ) > 1 and k.startswith('='):
for c in k[1:]:
w.PressKey( c )
else:
w.PressKey( k )
def WaitForegroundWindow ( name_pattern,timeout=5 ):
w = Win32()
import time,re
for i in xrange( int( timeout/0.1 )):
name = w.GetForegroundWindowTitle()
if re.match( name_pattern,name ):
return name
time.sleep( 0.1 )
# on attend qu'une fenêtre de bloc note (notepad.exe) ait le focus
if WaitForegroundWindow('.*Bloc-note.*'):
# et on lui envoie plein de caractères !
PressKeys( '+ctrl','home','-ctrl',r'''=# Bonjour le monde ! Voici plein de caractères bizarres : \/"'`:;.?@#$%<>(){}[] éèàç °¤µ§¨^£''','enter') |
Partager