what SendMessage to use to send keys directly to another window?
When I wrote the question, I understood that SendKeys
is the correct way to generate keyboard input, and that's the only one that works in all cases. However, I couldn't use SendKeys
, cause the computer my program is running on will be actively used while my program is running, meaning a mouse-click can happen at any time that will change the focus of the window and make SendKeys
start sending input to the wrong window.
What I wanted to know was just why in particular my code wasn't working - was I doing something wrong with the types of messages I was sending? Post
vs. Send
? What should WPARAM
be? Etc... The answer was probably cause I was sending the messages to the Notepad window, and not to the edit control found inside Notepad - I suspect that will work.
Anyway, I tried sending input to the app I wanted it to actually work on, and this ended up working:
def send_input_hax(hwnd, msg):
for c in msg:
if c == "\n":
win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
win32api.SendMessage(hwnd, win32con.WM_KEYUP, win32con.VK_RETURN, 0)
else:
win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0)
So the answer is that I wasn't doing anything wrong in terms of the message types or the contents of the message, it was just to an incorrect destination.
Claudiu
Graduated from Brown University. E-mail: [email protected]
Updated on June 04, 2022Comments
-
Claudiu almost 2 years
I'm trying to use
SendMessage
to send keyboard input to another window. I know the drawbacks, but I have to do it since I have to send several keys and I can't guarantee that the window will have focus - so this has to work when the window doesnt have focus.I'm testing it by trying to send keys to a notepad window. I've tried the following variations, and none have worked:
def post_keys1(hwnd): win32api.SendMessage( hwnd, win32con.WM_KEYDOWN, ord('A'), 0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) win32api.SendMessage( hwnd, win32con.WM_CHAR, ord('A'), 0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) win32api.SendMessage( hwnd, win32con.WM_KEYUP, ord('A'), 0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24)) def post_keys2(hwnd): win32api.PostMessage( hwnd, win32con.WM_KEYDOWN, ord('A'), 0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) win32api.PostMessage( hwnd, win32con.WM_CHAR, ord('A'), 0 + (0 << 8) + (ord('A') << 16) + (0 << 24)) win32api.PostMessage( hwnd, win32con.WM_KEYUP, ord('A'), 0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24)) def post_keys3(hwnd): win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0) def post_keys4(hwnd): win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0) def post_keys5(hwnd): win32api.PostMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0) win32api.PostMessage(hwnd, win32con.WM_CHAR, ord('A'), 0) win32api.PostMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0) def post_keys6(hwnd): win32api.SendMessage(hwnd, win32con.WM_KEYDOWN, ord('A'), 0) win32api.SendMessage(hwnd, win32con.WM_CHAR, ord('A'), 0) win32api.SendMessage(hwnd, win32con.WM_KEYUP, ord('A'), 0)
-
tokland about 11 years+1 But just a note in case it happens to others: in some apps you must use
PostMessage
instead ofSendMessage
for the simulation ofVK_RETURN
to work.