如何判断我的用户是否关注终端



我正在通过GUI使用CLI创建聊天室应用程序,并且我在windows上,所以我只需在命令提示符下使用默认终端来运行代码。我的程序检测单个按键,然后将它们添加到我的数据类中的列表中,当加入时,该列表将创建用户的消息。我在这里遇到的唯一问题是,即使程序没有聚焦,它也会记录按键。有没有什么方法可以检测终端是否对焦,这样我就可以适当地处理按键了?我现在在这里拥有的基本上是一个偶然的键盘记录程序。

我的代码(虽然对这个问题没有用处,但我觉得我应该添加它以备不时之需(:

import json, keyboard, os, socket, termcolor, threading

def addKey(key):
data.line.append(key)
data.lineLength += 1

def cls():
os.system("cls")

def display_chatLog():
return "n".join(data.chatLog)

def display_lineLength():
return f"Characters: {data.lineLength}/{data.maxLineLength}nn"

def display_userInput():
return f"n{data.start} {''.join(data.line)}{data.end}n"

def enterPressed():
joinLine = " ".join(data.line)
if data.server:
if data.lineLength <= data.maxLineLength:
data.server.send(bytes(f"{data.username}: {joinLine}", "utf-8"))
data.line = []
else:
data.warning = "Your message is too long"
else:
if data.line[0] == "host":
port = data.line[1]
else:
IP = data.line[1]
port = data.line[2]

def getKeys():
specialKeys = ("backspace", "ctrl", "enter", "esc", "shift", "right shift", "space")
while True:
key = keyboard.read_event()
keyType = key.event_type
keyName = key.name
if keyType == "down":
if keyName not in specialKeys:
addKey(keyName)
elif keyName == "backspace":
if len(data.line) > 0:
del data.line[len(data.line) - 1]
data.lineLength -= 1
elif keyName == "enter":
enterPressed()
elif keyName == "shift":
if keyboard.is_pressed(f"shift+{keyName}") and keyName not in specialKeys:
addKey(keyName.upper)
elif keyName == "space":
addKey(" ")

class data:
chatLog = []
end = "_"
line = []
lineLength = 0
maxLineLength = 512
server = None
start = ">>>"
warning = "Make sure to either host a server using 'host (port)' or join one by using 'join (IP adress) (port)'"

getKeys_thread = threading.Thread(target = getKeys)
getKeys_thread.start()

while True:
cls()
print(display_chatLog(), display_userInput(), display_lineLength(), "n", termcolor.colored(data.warning, "red", "on_white"))
import ctypes
def getWindow():
hwnd = ctypes.windll.user32.GetForegroundWindow()
length = ctypes.windll.user32.GetWindowTextLengthW(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
ctypes.windll.user32.GetWindowTextW(hwnd, buff, length + 1)
return (buff.value, hwnd) # buff.value is the title of the window, hwnd is the window handle

这段代码是我从这里得到的,经过轻微编辑后,我可以捕获当前关注窗口的名称和窗口句柄。

最新更新