On 10/24/21, Stefan Ram <r...@zedat.fu-berlin.de> wrote: > r...@zedat.fu-berlin.de (Stefan Ram) writes: >>tab_down_hllDll.GetKeyState(tab_down_VK_TAB) & 0b1000000000000000 > > In the meantime, I read about "GetAsyncKeyState". I thought that > this would solve my problem, but no.
Odd. It works for me in the classic console and the Windows Terminal pseudoconsole. The tab key's up/down state is updated immediately. import ctypes import msvcrt import time kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) user32 = ctypes.WinDLL('user32', use_last_error=True) VK_TAB = 0x09 def tab_down(): return bool(user32.GetAsyncKeyState(VK_TAB) & 0x8000) def flush_console_input(): """Flush the input buffer of the process (pseudo)console.""" try: with open('conin$') as f: h = msvcrt.get_osfhandle(f.fileno()) kernel32.FlushConsoleInputBuffer(h) except OSError: pass def test(): for i in range(100): print('tab down:', tab_down()) time.sleep(0.1) flush_console_input() test() Flushing the console input buffer isn't necessary. I just prefer it instead of leaving the key presses in the buffer. Usually a GUI wants GetKeyState() instead, which is synchronized with input messages in the thread's message queue as they're processed. But GetAsyncKeyState() should do what you want, if you don't need synchronization with input messages. -- https://mail.python.org/mailman/listinfo/python-list