2012-03-14 19 views
5

Tengo una ventana de solo mensaje (ATL :: CWindowImpl) que se registra para la entrada sin procesar usando el indicador RIDEV_INPUTSINK, lo que significa que obtiene toda la entrada independientemente de si la ventana es de primer plano. Esto funciona muy bien cuando solo hay una instancia de esa ventana.Múltiples puertos de ventana de entrada sin formato

Sin embargo, cuando creo más de 1 instancia de mi ventana, solo una recibe los mensajes WM_INPUT (actualmente estoy creando dos, y solo el segundo para crear recibe los mensajes).

RegisterRawInputDevices (utilizando RIDEV_INPUTSINK | RIDEV_NOLEGACY) está teniendo éxito durante la creación de ambas ventanas. Además, la ventana que no recibe la entrada en bruto sigue recibiendo otros mensajes, por lo que no es un problema con la ventana en sí ...

Si es relevante, estoy usando el VC11 beta, y se crean ventanas y envío de mensajes en diferentes hilos (usando std :: hilo).

¿Es esto una limitación de API (es decir, está limitado a un receptor de entrada por proceso)? ¿O hay una forma de que esto funcione?

Gracias de antemano.

EDIT:

Ahora mismo mi solución actual es tener sólo una ventana y a que pase en los mensajes de entrada a las otras ventanas, sin embargo, esto es un desastre, y no va a funcionar en el caso de que quiero que funcione (donde tengo mi aplicación cargando complementos que pueden querer entrada sin procesar, no quiero que tengan que registrarse con mi aplicación a menos que realmente tenga que hacerlo de esa manera ...).

+3

Esta es la debacle TOPMOST. –

+1

IIRC, la forma recomendada de tratar esto es que una ventana reciba la entrada sin formato y luego genere eventos para otras ventanas interesadas. En otras palabras, no hará lo que quiera :) – JimR

+0

La gran pregunta, de acuerdo con [la documentación] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645565 (v = vs.85) .aspx): ¿configuró 'hwndTarget' correctamente? – MrGomez

Respuesta

5

Desde MSDN (here y here), la API completa para Raw Input habla siempre sobre la aplicación y no sobre la ventana ... lo que significa que una aplicación que se registre como entrada sin procesar será tratada por el sistema operativo como una entidad ... usted probó indirectamente al registrar un segundo winow de recepción, el primero simplemente dejó de recibir porque el sistema operativo entrega entrada sin procesar a la aplicación (representada exactamente en una ventana como el sumidero).

Cuestiones relacionadas