Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Win32 SendInput Overflow

1 view
Skip to first unread message

Ralph 'rkhb' Bauer

unread,
Jul 6, 2009, 6:07:08 AM7/6/09
to
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

Uwe Sieber

unread,
Jul 9, 2009, 3:06:14 AM7/9/09
to
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

Ralph 'rkhb' Bauer

unread,
Jul 9, 2009, 3:58:28 AM7/9/09
to
Uwe Sieber schrieb:

Das klappt leider nicht. Ich gehe gerade mit dem Problem hausieren und darf
der Einfachheit und der Synchronizit�t halber auf einen Forumsbeitrag mit
Beispielsprogramm von mir verweisen:

http://www.coding-board.de/board/showpost.php?p=166130&postcount=3

Oder habe ich einen Programmierfehler verbockt?

viele gr��e
ralph

Uwe Sieber

unread,
Jul 9, 2009, 5:28:00 AM7/9/09
to

WaitForInputIdle(pi.hProcess,0);

Mit 0 als Wartezeit wartet es nicht und auf den
R�ckgabewert zu schauen, schadet nicht...


Gru� Uwe

Ralph 'rkhb' Bauer

unread,
Jul 9, 2009, 9:11:13 AM7/9/09
to
Uwe Sieber schrieb:

> Ralph 'rkhb' Bauer wrote:
>> Oder habe ich einen Programmierfehler verbockt?
>
> WaitForInputIdle(pi.hProcess,0);
>
> Mit 0 als Wartezeit wartet es nicht

Uiii! *sch�m*.

Wenn ich dann hinter WaitForInputIdle(hProcess2,INFINITE) (in der
MySendInput-Funktion) noch ein Sleep(10) einf�ge (wahrscheinlich um nochmal
einen Thread-Wechsel herbeizuf�hren), dann klappt alles wie gew�nscht.

> und auf den
> R�ckgabewert zu schauen, schadet nicht...

Womit mir zum soundsovielten Mal klargemacht wurde, dass FindWindow nach
CreateProcess trotz WaitForInputIdle noch ein Weilchen lang nichts findet. ;-)

Vielen Dank!

viele gr��e
ralph

0 new messages