รับอินพุตโดยไม่ต้องโฟกัสใน Python / Pygame หรือไม่

ฉันกำลังสร้างแอปเล็กๆ สำหรับตัวเองเพื่อให้สามารถแสดงอินพุตคีย์บอร์ดของฉันและแสดงในรูปแบบจอยสติ๊ก เช่นนี้

มุมมองปัจจุบันของแอปของฉัน

ตัวมันเองทำงานได้ดีอย่างสมบูรณ์แบบในขณะที่หน้าต่าง Pygame ถูกโฟกัส ปัญหาของฉันคือ ฉันไม่สามารถโฟกัสสิ่งนี้ได้ตลอดเวลา อันที่จริงมันจะไม่มีวันโฟกัส เพราะไม่ว่าจะด้วยวิธีใด ฉันจะใช้ OBS เพื่อสตรีม หรือจะใช้ โปรแกรมจำลองของฉันและ pygame ตรวจไม่พบอินพุตที่อยู่นอกหน้าต่าง มีวิธีใดบ้างที่จะทำให้ python หรือ pygame อ่านอินพุตทั้งหมดที่ทำกับคอมพิวเตอร์??? ฉันกำลังชนกำแพงที่นี่ ขอบคุณล่วงหน้า!!


person NyxTheShield    schedule 22.07.2015    source แหล่งที่มา
comment
Pygame ไม่สามารถทำสิ่งนั้นให้คุณได้ด้วยการจัดการเหตุการณ์ เนื่องจากมันจะฟังเฉพาะเหตุการณ์ในหน้าต่างเท่านั้น สิ่งที่คุณกำลังมองหา hooks ระดับต่ำลองดูที่นี่ การใช้ hooks ของแป้นพิมพ์ระดับต่ำกับ Python และ SetWindowsHookExA เป็นตัวอย่าง   -  person sloth    schedule 22.07.2015


คำตอบ (2)


ใช้ pygame.event.grab(True)

เมื่อโปรแกรมของคุณทำงานในสภาพแวดล้อมแบบหน้าต่าง มันจะแชร์อุปกรณ์เมาส์และคีย์บอร์ดกับแอพพลิเคชั่นอื่นที่มุ่งเน้น หากโปรแกรมของคุณตั้งค่าการจับเหตุการณ์เป็น True มันจะล็อคอินพุตทั้งหมดไว้ในโปรแกรมของคุณ เป็นการดีที่สุดที่จะไม่รับอินพุตเสมอไป เนื่องจากจะป้องกันไม่ให้ผู้ใช้ทำสิ่งอื่นบนระบบของตน

คุณจะต้องมีวิธีอื่นในการออก เนื่องจากคุณจะไม่สามารถเลื่อนเมาส์ออกจากหน้าต่างจอแสดงผลได้

person Luke Borowy    schedule 25.07.2015
comment
คุณกำลังพูดถึง set_grab() หรือไม่? มันใช้งานไม่ได้ ลองแล้ว - person NyxTheShield; 26.07.2015
comment
ใช่ฉันเป็น. ขออภัยที่สะกดผิด. น่าเสียดายที่ไม่ได้ผล - person Luke Borowy; 27.07.2015

ตามความคิดเห็นสองข้อด้านบนโดยตรง เพื่อมุ่งเน้นไปที่หน้าต่าง pygame (ให้เคอร์เซอร์อยู่ในขอบเขตของหน้าต่าง pygame อย่างมีประสิทธิภาพจนกว่าฉันจะสามารถทำงานนี้ด้วยรหัสต่อไปนี้:

pygame.event.set_grab(True) # Keeps the cursor within the pygame window

รวมโค้ดนี้เข้ากับวิธีออกจากโปรแกรมด้วยการกดปุ่ม เช่น ปุ่ม ESCAPE (เนื่องจากเป็นไปไม่ได้ที่จะปิดหน้าต่างด้วยการเลื่อนเคอร์เซอร์ไปที่กรอบของหน้าต่างเพื่อปิดด้วยวิธีนั้นด้วย pygame.QUIT):

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            run = False
person thescoop    schedule 09.10.2018