vive unity openvr manager htc windows winapi focus unity3d joystick

windows - openvr - unity vr controller



Aceptar entrada mientras está fuera de foco (2)

No sé si hay una solución relacionada con Unity, pero puede usar la API RawInput para recibir eventos directamente desde el hardware del Mouse / Joystick / HID independientemente de si su aplicación está enfocada o no.

Nunca realicé una pregunta sobre Stack Overflow, aunque casi todas las preguntas de programación que he tenido alguna vez he encontrado una respuesta aquí. Lamentablemente hoy no es uno de esos días.

Me he pasado todo el día buscando en Google, navegando en la API de Win32 y probando todo tipo de cosas, pero no puedo encontrar la maldita respuesta que estoy buscando.

Esta es la situación: tengo un proyecto de Unity que he creado, utiliza la entrada de un joystick, hay otros componentes para este proyecto fuera de la unidad, pero eso es irrelevante, la base de mi problema es este: ¿cómo puedo hacer una aplicación continúa aceptando entrada mientras está desenfocada / Inactiva.

Sé con certeza que se puede hacer porque Borderlands 2 puede hacerlo (lo descubrí ayer cuando comencé a tratar de encontrar una respuesta, lo cual fue agravante porque eso demuestra que hay una manera, y no estoy logrando encontrarla). eso).

Por lo menos, si alguien sabe cómo hacer esto para mouse o teclado, eso sería lo suficientemente útil como para permitirme descubrir cómo aplicarlo a un joystick.

Algunos detalles útiles: soy un programador ávido y experimentado, y he estado codificando en: C / C ++, C #, Java y varios lenguajes de scripting durante muchos años. Es lo que hago como hobby, para mi trabajo, en mi tiempo libre, mientras duermo ...

Cosas que he hecho / probado:

  • utilizando SetFocus + SetActive desde user32 y pasando null como la ventana perdiendo foco
  • agregando WM_KILLFOCUS a la lista de ignorar de la otra ventana que quiero leer entrada mientras estaba en segundo plano
  • usando sendmessage para engañar a la otra ventana para leer la entrada
  • anulando el inputstream de inputstream de la aplicación (pero esto era un sentido inútil no podía entender cómo enviar la entrada del joystick sobre la transmisión, y también porque aún no resolvía el problema si esa otra aplicación estaba desenfocada (es decir, abrir bloc de notas), la entrada se detendría.

  • También busqué una forma de hacer que un juego / proyecto / aplicación independiente de Unity aceptara la entrada mientras estaba en segundo plano, pero eso no arrojó nada.


Realmente creo que la respuesta dada por @RemyLebeau es la forma correcta de rastrear la entrada. Sin embargo, si le GetForegroundWindow piratería, puede usar GetForegroundWindow , GetWindowThreadProcessId , AttachThreadInput para adjuntarlo al subproceso activo de la interfaz de usuario. Pero luego necesitaría ''extraer'' el estado de entrada (por ejemplo, con GetKeyState , GetKeyboardState o GetKeyboardState ) y rastrear el enfoque a medida que cambia los hilos para separarlos / adjuntarlos a un nuevo hilo. No puede simplemente esperar (por ejemplo, con GetMessage ) un mensaje de entrada publicado en un hilo diferente.