C# a fungování SendKeys.SendWait/keybd_event ve Win7 a Win10

Kaštan

Omlouvám se za dotaz ze světa Win. Udělal jsem si v C# aplikaci, která umí do jiné běžící aplikace poslat sekvenci stisknutých kláves via SendKeys.SendWait/keybd_event (RFID kód karty do DOS aplikace). Na Win10 funguje toto "podvrhnutí" kláves bezvadně a na Win7 vůbec. Myslel jsem si, že spuštění pod aministrátorem ve Win7 zafunguje, ale nepomohlo to. Žádná chyba, zádný log. Díky za rady.


.

Re:C# a fungování SendKeys.SendWait/keybd_event ve Win7 a Win10
« Odpověď #1 kdy: 26. 10. 2018, 01:59:36 »
Viděl bych to v tomto:

The SendKeys class is susceptible to timing issues, which some developers have had to work around. The updated implementation is still susceptible to timing issues, but is slightly faster and may require changes to the workarounds. The SendKeys class tries to use the previous implementation first, and if that fails, uses the new implementation. As a result, the SendKeys class may behave differently on different operating systems. Additionally, when the SendKeys class uses the new implementation, the SendWait method will not wait for messages to be processed when they are sent to another process.

If your application relies on consistent behavior regardless of the operating system, you can force the SendKeys class to use the new implementation by adding the following application setting to your app.config file.

<appSettings>

<add key="SendKeys" value="SendInput"/>

</appSettings>

To force the SendKeys class to use the previous implementation, use the value "JournalHook" instead.

Já na toto používám https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendinput a nemám problém.

Kaštan

Re:C# a fungování SendKeys.SendWait/keybd_event ve Win7 a Win10
« Odpověď #2 kdy: 26. 10. 2018, 09:03:09 »
Díky za info. Toto jsem samozřejmě zkoušel (SendInput i JournalHook). Dopadl jsem stejně (tj. ve win7 žádná reakce). Nakonec jsem se posunul dál díky SendInput (viz. http://www.pinvoke.net/default.aspx/coredll/SendInput.html). Díky tomu jsem podvrhnutí ve win7 konečně rozjel. Stále ale řeším problém, že někdy klávesa není poslána a jindy že se pošle jiný znak, než který očekávám (znaky z numpadu, třeba místo kl. Home se pošle 7 a naopak a to bez ohledu, jak nastavím NumLock). Zatím to řeším timeoutem 0.5 sec mezi posíláním znaků, ale stejně z toho nemám dobrý pocit. Nevím, jestli to je tím, že aplikace se spouští se sdíleného disku a občas hledá v binárních strukturách, nebo jestli dělám jinou chybu (je .NET 4.5 pro win7 ta správná verze? atd...).

filip

Re:C# a fungování SendKeys.SendWait/keybd_event ve Win7 a Win10
« Odpověď #3 kdy: 26. 10. 2018, 11:12:10 »
tohle nebude nikdy uplne spolehlive. Asi by slo poslat znaky, pockat, a nasledne je precist zpatky a porovnat. Pri rozdilu opakovat.
Ja pouzivam https://www.pinvoke.net/default.aspx/user32.SendMessage, kde neni nativni API. Stejne to ale neni 100%.