大约12年前,我为托盘中的Windows编写了一个程序,当某些Windows获得焦点时,它会向它们发送击键。我已经没有密码了,我忘记了所有的细节。
不过,这个过程还是会像这样运作的。
Window
)执行事件处理。
应用程序可能有几种方法来选择
target
窗户。虚拟键盘窗口可能需要窃取焦点(以接收鼠标事件),但它随后需要知道将击键发送到哪个窗口。
SendMessage
向目标窗口发送击键。我建议一开始只是转发常规的击键,然后再担心捕捉鼠标点击。
我可以把这些拼凑起来,把击键发送到另一个窗口。
import win32ui
import win32con
import time
from ctypes import *
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)]
def send_char(char):
FInputs = Input * 1
extra = c_ulong(0)
ii_ = Input_I()
KEYEVENTF_UNICODE = 0x4
ii_.ki = KeyBdInput( 0, ord(char), KEYEVENTF_UNICODE, 0, pointer(extra) )
x = FInputs( ( 1, ii_ ) )
windll.user32.SendInput(1, pointer(x), sizeof(x[0]))
if __name__ == '__main__':
wnd = win32ui.FindWindow(None, '* Untitled - Notepad2 (Administrator)')
type_this = 'jaraco'
wnd.SetFocus()
wnd.SetForegroundWindow()
for char in type_this:
send_char(char)
我发现PostMessage技术效果不太好(我根本无法让它为我工作)。
我在网上也发现了这篇文章
identifying the last active window
.