

Win7 32b, softwarové ovládání DOSovské aplikace...
Zdar borci!
Původně jsem chtěl napsat nadpis jako:
Život není lehký
nebo
Hardcore porno
Ale tak bych mohl zahrát na nervy administrátorům. A teď k věci. Jestli tohle vyřeší nějaký borec, tak bude lepší, než já.
Jde o tohle. Pokud chcete posílat klávesové výstupy("z klávesnice") nějaké aplikaci ve Windows, je nejjednodušší řešení
použit prográmek .NET, kde zavoláte něco na způsob:
...
System.Windows.Forms.Sendkeys.Sendwait("{ENTER}");
...
Stačí si defakto ošéfovat, aby daná aplikace měla focus a jste na koni...
Jenže....
Život není lehký
nebo
Hardcore porno
Tyto .NETovské legrace kompletně ztrácí úplný význam, pokud jde o DOS aplikaci.
V lepším případě na tyto "povely" nereagují, nebo se aplikace ukončí.....
Podle mého testování to vypadá, že cesta vede skrz nativní "user32.dll" ......
Je však potřeba mimo jiné v programu získat pointer na DOSovský proces.
Ukázka z fce Main v přiloženém kódu:
int procesId = YourEnumerateClass.Enum16BitProcesses();
Process processes = Process.GetProcessById(procesId);
if (processes == null)
throw new Exception("Could not find the process; is running?");
IntPtr WindowHandle = processes.MainWindowHandle;
PressKey('a', true); // druhý parametr určuje stisknuto/odstisknuto
System.Threading.Thread.Sleep(100);
PressKey('a', false);
Testuju to na starém M602 a bohužel program žádnou chybu nehlásí, ale nefunguje to (nedělá to opticky nic).
V příloze přikládám samostatný consolový, kompilovatelný projekt.
Předem díky za cenné rady, soudruzi.....
Pokud je to standardní konzole, bude fungovat stdin a stdout. Ale musis zapomenout na frontu zprav, ta v konzole neni.
Dobře soudruzi..... nějak jsem si to přebral.
Bohužel mám teď pouze 64b Win a tam mi DOSovské app nejedou.
Podle zdejších inspirací by na to měla stačit keybd_event z user32.dll .
Bude stačit tohle?
Mimochodem, co znamená parametr byte bScanCode ve fci keybd_event?
Můžu někde najít tuto tabulku v bytech? (Myslím ty bScanCode)
No zítra večer dám úplný report.
A s tím simulátorem kláves to vypadá nadějně:
http://inputsimulator.codeplex.com/discussions/228 707
Jediné co nefunguje je posílání řetězců (jak to vypadá...) ale ty já ani nepotřebuju
a je možné se bez nich obejít.
ScanCode je kod klavesy, ale ne ASCII hodnota, ale hodnota prirazena kazde konkretni kavese na klavesnici. Co to nakonec bude zalezi pak na interpretaci daneho programu.
Scancode
Uffff.
Podporujeme dinosaury (TM).
Testoval jsem jak tu slavnou knihovnu pro simulaci kláves, tak keybd_event.
Nefungovalo nic.
Zkoušel jsem všechny návrhy, ale zafungovalo mi až jediné řešení.
Tak jsem to úplně haluzácky pořešil.
Win32 API se moc nechytá, protože pokud nemá okno focus, tak snad není ani aktivní pro příjem podle některých zdrojů.
Našel jsem List of Virtual Key Codes.
Ale obecně to funguje všelijak. V závislosti na Windows a DOSovské aplikaci.
Někde například nefunguje směrová šipka dolů, jinde zase pomůže deaktivovat Num lock na klávesnici a podobně.
Prostě vzrůšo.
V podstatě stačí nastavit virtuální ScanKey2 a je vymalováno.
Bez zajímavosti také není, že aplikace se chová úplně jinak na 32b Windows a úplně jinak na 64b.
Například tentýž kód způsobuje v jednom případě odeslání Enteru a ve druhém případě key_down.
Navíc se to, jak jsem již psal chová odlišně v různých DOSovských aplikacích.
keby si posielal wm_keydown a wm_keyup message jak som pisal tak by IMHO fungovalo vsetko vzdy. Nechapem preco furt kazdy chce lepit nejake cudzie kniznice
P.S. a pracuj rovno so scan kodmi, a ne s ascii a lepit cosi s konverznymi fciami ktore pisal nejaky pako v MS. Klavesnica neposiela ziadne ascii. Viz MSDN WM_KEYDOWN