2012-03-14 11 views
5

Mam okno z komunikatem (ATL :: CWindowImpl), które rejestruje się jako surowe dane wejściowe za pomocą flagi RIDEV_INPUTSINK, co oznacza, że ​​pobiera wszystkie dane wejściowe, niezależnie od tego, czy okno jest oknem pierwszego planu. Działa to świetnie, gdy istnieje tylko jedna instancja tego okna.Kilka okien wejściowych surowego wejścia

Jednak, gdy tworzę więcej niż 1 wystąpienie mojego okna, tylko jeden otrzymuje komunikaty WM_INPUT (obecnie tworzę dwa, a tylko drugi, który zostanie utworzony, otrzymuje wiadomości).

RejestracjaRawInputDevices (przy użyciu RIDEV_INPUTSINK | RIDEV_NOLEGACY) kończy się powodzeniem podczas tworzenia obu okien. Ponadto, okno nie otrzymujące nieprzetworzonych danych wejściowych nadal otrzymuje inne wiadomości, więc nie stanowi to problemu z samym oknem ...

Jeśli jest to istotne, korzystam z wersji beta VC11, a okna są tworzone i wysyłane wiadomości różne wątki (używając std :: thread).

Czy to jest ograniczenie interfejsu API (tzn. Ograniczono się do jednego zlewu wejściowego na proces)? Czy istnieje sposób, aby to zadziałało?

Z góry dziękuję.

EDIT:

Teraz moja obecna obejście jest tylko jedno okno i na to, aby przekazać wiadomości wejściowych do innych okien, jednak to jest bałagan, i nie będzie działać w przypadku I chcę, żeby to działało (gdzie mam wtyczki do ładowania aplikacji, które mogą wymagać surowego wejścia, nie chcę, aby rejestrowały się w mojej aplikacji, chyba że naprawdę muszę to zrobić w ten sposób ...).

+3

To jest fiasko TOPMOST. –

+1

IIRC, zalecanym sposobem radzenia sobie z tym problemem jest uzyskiwanie nieprzetworzonego wejścia przez jedno okno, a następnie generowanie zdarzeń w innych zainteresowanych oknach. Innymi słowy, nie zrobi to, co chcesz :) – JimR

+0

Duże pytanie, według [dokumentacji] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645565 (v = vs.85) .aspx): czy poprawnie ustawiłeś 'hwndTarget'? – MrGomez

Odpowiedz

5

Od MSDN (here) i here całego API dla surowego rozmów wejściowe zawsze o aplikacji, a nie o okna ... co oznacza, że ​​aplikacja rejestracji dla wejścia surowca będą trated przez system operacyjny jako jeden entitiy ... co pośrednio sprawdziłeś, rejestrując drugi odbierający winow - pierwszy przestał odbierać, ponieważ system dostarcza surowy sygnał wejściowy do aplikacji (reprezentowany przez dokładnie to okno jako zlew).