Win32 SendInput Overflow

06/07/2009 - 12:07 von Ralph rkhb Bauer | Report spam
Hallo,

ich experimentiere gerade mit SendInput dem Win32-API (WinXPSP3 mit allen
Updates) herum und bin auf folgendes Phànomen gestoßen:

Versendet man mehr als 10000 Input-Strukturen an Notepad, dann werden nur
10000 Strukturen gesendet, der Rest kommentarlos "vergessen". Zurückgegeben
wird allerdings die volle Input-Anzahl, eine Abfrage von GetLastError dürfte
also keine Erkenntnis bringen. Auch in der Ereignisanzeige findet sich nichts.
Teilt man die Sendung in mehrere Abschnitte zu je maximal 10000 Inputs auf,
dann muss man zwischen dem Versenden eine Pause mit Sleep() einlegen. Die
notwendige Lànge der Pause variiert bei mir zwischen 500 und 3000 ms.

Per Google habe ich noch nicht einmal herausgefunden, welcher Puffer da
überlàuft. Die MSDN spricht von "keyboard input stream"
(<http://msdn.microsoft.com/en-us/library/ms646310(VS.85).aspx>). An anderer
Stelle existieren nur noch "message queues"
(<http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx#_win32_Keyboard_Input_Model>).
Andere sprechen von "keyboard buffer", "event queue" und anderes.
Dementsprechend habe ich auch noch keinen Tipp gefunden, womit ich den
Overflow vermeiden/abfangen/hàndeln kann, ohne auf das Glücksspiel mit Sleep()
angewiesen zu sein.

Oder fehlt mir einfach nur die richtige Erleuchtung?

viele grüße
ralph
 

Lesen sie die antworten

#1 Uwe Sieber
09/07/2009 - 09:06 | Warnen spam
Ralph 'rkhb' Bauer wrote:
Hallo,

ich experimentiere gerade mit SendInput dem Win32-API (WinXPSP3 mit allen
Updates) herum und bin auf folgendes Phànomen gestoßen:

Versendet man mehr als 10000 Input-Strukturen an Notepad, dann werden nur
10000 Strukturen gesendet, der Rest kommentarlos "vergessen". Zurückgegeben
wird allerdings die volle Input-Anzahl, eine Abfrage von GetLastError
dürfte
also keine Erkenntnis bringen. Auch in der Ereignisanzeige findet sich
nichts.
Teilt man die Sendung in mehrere Abschnitte zu je maximal 10000 Inputs auf,
dann muss man zwischen dem Versenden eine Pause mit Sleep() einlegen. Die
notwendige Lànge der Pause variiert bei mir zwischen 500 und 3000 ms.



WaitForInputIdle statt Sleep:
(http://msdn.microsoft.com/en-us/library/ms687022(VS.85).aspx)


Gruß Uwe

Ähnliche fragen