Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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.....

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Uffff. Podporujeme dinosaury (TM). Testoval jsem jak tu slavnou knihovnu pro simulaci kláves, tak…
Flash_Gordon 12.08.2014 21:26
Flash_Gordon
Ale obecně to funguje všelijak. V závislosti na Windows a DOSovské aplikaci. keby si posielal wm_ke… poslední
MM.. 13.08.2014 10:09
MM..

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.

    [DllImport("user32.dll")]
    public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

            
    [DllImport("user32.dll")] 
    static extern int MapVirtualKey(uint uCode, uint uMapType);

public static void Main()
        {
         const byte KEYEVENTF_KEYUP = 2;
         
          int ScanKey2 = MapVirtualKey(	0x09, 0);   // 	0x09 =  tabulátor 
         Console.WriteLine("int kode:{0} "+ ScanKey2);
        System.Threading.Thread.Sleep(3000);
        keybd_event(0x28, (byte)ScanKey2, 0, 0);
        keybd_event(0x28, (byte)ScanKey2, KEYEVENTF_KEYUP, 0); 

        }

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.

MISSION ACCOMPLISHED

Ale obecně to funguje všelijak. V závislosti na Windows a DOSovské aplikaci.

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

Zpět do poradny Odpovědět na původní otázku Nahoru