fork download
  1. #!/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import ctypes
  5.  
  6. class PostWinMsg(object):
  7. def __init__(self, hwnd, wait=0, fg=False):
  8. self.hwnd = hwnd
  9. self.wait = wait
  10. if fg: self.foreground()
  11.  
  12. @classmethod
  13. def target(cls, wname, cname=None, chwnd=None, phwnd=None):
  14. return ctypes.windll.user32.FindWindowExW(
  15. phwnd if phwnd else 0, chwnd if chwnd else 0,
  16. ctypes.c_wchar_p(cname) if cname else 0,
  17. ctypes.c_wchar_p(wname) if wname else 0)
  18.  
  19. def getclassname(self, l):
  20. buf = ctypes.c_wchar_p(u' ' * (l + 1))
  21. ctypes.windll.user32.GetClassNameW(self.hwnd, buf, l + 1)
  22. return buf.value
  23.  
  24. def foreground(self):
  25. ctypes.windll.user32.SetForegroundWindow(self.hwnd)
  26.  
  27. def topmost(self, flg=True):
  28. ctypes.windll.user32.SetWindowPos(self.hwnd,
  29. -1 if flg else -2, # HWND_TOPMOST or HWND_NOTOPMOST
  30. 0, 0, 0, 0, 3) # SWP_NOSIZE | SWP_NOMOVE
  31.  
  32. def sleep(self, ms):
  33. ctypes.windll.kernel32.Sleep(ms)
  34.  
  35. def isalnum(self, c):
  36. return (0x30 <= c <= 0x39) or (0x41 <= c <= 0x5A) or (0x61 <= c <= 0x7A)
  37.  
  38. def wm(self, msg, wp, lp):
  39. if self.wait: self.sleep(self.wait)
  40. ctypes.windll.user32.PostMessageW(self.hwnd, msg, wp, lp)
  41.  
  42. def syskeyd(self, vk):
  43. self.wm(260, vk, 1 << 29) # WM_SYSKEYDOWN lparam = Alt down
  44.  
  45. def syskeyu(self, vk):
  46. self.wm(261, vk, 6 << 29) # WM_SYSKEYUP lparam = Alt up
  47.  
  48. def syskeydu(self, vk):
  49. self.wm(260, vk, 1 << 29) # WM_SYSKEYDOWN lparam + Alt
  50. if self.isalnum(vk): self.wm(262, vk, 7 << 29) # WM_SYSCHAR lparam + Alt
  51. self.wm(261, vk, 7 << 29) # WM_SYSKEYUP lparam + Alt
  52.  
  53. def altkeys(self, s):
  54. self.syskeyd(18) # Alt down
  55. for c in s: self.syskeydu(ord(c))
  56. self.syskeyu(18) # Alt up
  57.  
  58. def keydu(self, vk):
  59. self.wm(256, vk, 0) # WM_KEYDOWN
  60. if self.isalnum(vk): self.wm(258, vk, 0) # WM_CHAR
  61. self.wm(257, vk, 0) # WM_KEYUP
  62.  
  63. def keys(self, s):
  64. for c in s: self.keydu(ord(c))
  65.  
  66. def mouseclk(self, b, x, y, dbl=False):
  67. lp = x + y * 2 ** 16
  68. wp = 1 if b == 0 else 2 if b == 1 else 16
  69. o = 3 * b
  70. self.wm(513 + o, wp, lp) # WM_LBUTTONDOWN
  71. self.wm(514 + o, wp, lp) # WM_LBUTTONUP
  72. if dbl: self.wm(515 + o, wp, lp) # WM_LBUTTONDBLCLK
  73.  
  74. if __name__ == '__main__':
  75. target = PostWinMsg.target(u'無題 - メモ帳')
  76. pwm = PostWinMsg(target, wait=1000, fg=True)
  77. pwm.keys('xyz abc')
  78. pwm.altkeys('FS')
Runtime error #stdin #stdout #stderr 0.01s 8016KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "prog.py", line 75, in <module>
  File "prog.py", line 14, in target
AttributeError: 'module' object has no attribute 'windll'