可以使用ctypes完成:
import ctypesfrom ctypes import wintypesimport timeuser32 = ctypes.WinDLL('user32', use_last_error=True)INPUT_MOUSE = 0INPUT_KEYBOARD = 1INPUT_HARDWARE = 2KEYEVENTF_EXTENDEDKEY = 0x0001KEYEVENTF_KEYUP = 0x0002KEYEVENTF_UNICODE = 0x0004KEYEVENTF_SCANCODE = 0x0008MAPVK_VK_TO_VSC = 0# msdn.microsoft.com/en-us/library/dd375731VK_TAB = 0x09VK_MENU = 0x12# C struct definitionswintypes.ULONG_PTR = wintypes.WPARAMclass MOUSEINPUT(ctypes.Structure): _fields_ = (("dx", wintypes.LONG), ("dy", wintypes.LONG), ("mouseData", wintypes.DWORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR))class KEYBDINPUT(ctypes.Structure): _fields_ = (("wVk", wintypes.WORD), ("wScan", wintypes.WORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR)) def __init__(self, *args, **kwds): super(KEYBDINPUT, self).__init__(*args, **kwds) # some programs use the scan pre even if KEYEVENTF_SCANCODE # isn't set in dwFflags, so attempt to map the correct pre. if not self.dwFlags & KEYEVENTF_UNICODE: self.wScan = user32.MapVirtualKeyExW(self.wVk, MAPVK_VK_TO_VSC, 0)class HARDWAREINPUT(ctypes.Structure): _fields_ = (("uMsg", wintypes.DWORD), ("wParamL", wintypes.WORD), ("wParamH", wintypes.WORD))class INPUT(ctypes.Structure): class _INPUT(ctypes.Union): _fields_ = (("ki", KEYBDINPUT), ("mi", MOUSEINPUT), ("hi", HARDWAREINPUT)) _anonymous_ = ("_input",) _fields_ = (("type", wintypes.DWORD), ("_input", _INPUT))LPINPUT = ctypes.POINTER(INPUT)def _check_count(result, func, args): if result == 0: raise ctypes.WinError(ctypes.get_last_error()) return argsuser32.SendInput.errcheck = _check_countuser32.SendInput.argtypes = (wintypes.UINT, # nInputs LPINPUT, # pInputs ctypes.c_int) # cbSize# Functionsdef PressKey(hexKeyCode): x = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=hexKeyCode)) user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))def ReleaseKey(hexKeyCode): x = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=hexKeyCode, dwFlags=KEYEVENTF_KEYUP)) user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x))def AltTab(): """Press Alt+Tab and hold Alt key for 2 seconds in order to see the overlay. """ PressKey(VK_MENU) # Alt PressKey(VK_TAB) # Tab ReleaseKey(VK_TAB) # Tab~ time.sleep(2) ReleaseKey(VK_MENU) # Alt~if __name__ == "__main__": AltTab()hexKeyCode是Windows API定义的虚拟键盘映射。代码列表在MSDN上可用:虚拟键代码(Windows)



