0

Alright, I know this question looks like a duplicate, but I don't think it is. I've read other posts about fake key presses which involve ctypes and SendKey. However, I've tried these and they don't work quite as I want. I don't want something that is similar to an actual keystroke, I want something that does EXACTLY the same thing as a keystroke. I've run some tests with ctypes, and I noticed the key presses don't behave the same as a real keystroke.

For example, if I open up notepad and hold down the A key, I get one A character, and about a second later it starts filling up with As. When I run PressKey() for A, it types a single A and that's it. I still have to run ReleaseKey() for A after it so other programs don't get messed up.

I need some way to do something like realKeyPress('A') and have it behave exactly like I pressed the A key. Also, thanks guys, you're always so fast to respond with nice answers!

4
  • See the article here. Commented Feb 12, 2015 at 22:41
  • I don't think this is what I'm looking for. I don't want to be able to catch input from a user, I want to make it seem like the user pressed a key on the keyboard. Commented Feb 12, 2015 at 22:56
  • Can it be a GUI? Try pygame or Tkinter. Commented Feb 12, 2015 at 23:17
  • 1
    Should this question have a "Windows" tag? It seems to be specific to Windows... Commented Feb 13, 2015 at 13:53

1 Answer 1

1

So I used ctypes after all. I modified the ctypes code after reading up on another answer similar to this topic. Here's the finished code:

import ctypes
import time

SendInput = ctypes.windll.user32.SendInput

# C struct redefinitions 
PUL = ctypes.POINTER(ctypes.c_ulong)
class KeyBdInput(ctypes.Structure):
    _fields_ = [("wVk", ctypes.c_ushort),
                ("wScan", ctypes.c_ushort),
                ("dwFlags", ctypes.c_ulong),
                ("time", ctypes.c_ulong),
                ("dwExtraInfo", PUL)]

class HardwareInput(ctypes.Structure):
    _fields_ = [("uMsg", ctypes.c_ulong),
                ("wParamL", ctypes.c_short),
                ("wParamH", ctypes.c_ushort)]

class MouseInput(ctypes.Structure):
    _fields_ = [("dx", ctypes.c_long),
                ("dy", ctypes.c_long),
                ("mouseData", ctypes.c_ulong),
                ("dwFlags", ctypes.c_ulong),
                ("time",ctypes.c_ulong),
                ("dwExtraInfo", PUL)]

class Input_I(ctypes.Union):
    _fields_ = [("ki", KeyBdInput),
                 ("mi", MouseInput),
                 ("hi", HardwareInput)]

class Input(ctypes.Structure):
    _fields_ = [("type", ctypes.c_ulong),
                ("ii", Input_I)]

# Actuals Functions

def PressKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def ReleaseKey(hexKeyCode):
    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.