Problem z wirtualnymi klawiszami pod DOS

0

Mam problem z uzyciem wirtualnym naciskaniem klawiszy w aplikacji pracujacej w srodowisku DOS. W notatniku dziala bez problemu.
A to fragment kodu zeby bylo wiadomo o co mi chodzi :

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
...
  tmp =Term->Text;     
  for(int i=1; i<=tmp.Length(); i++)
  {
        c = tmp[i];
        op = TextToShortCut( c );
        keybd_event( op, 0, 0, 0 );
        keybd_event( op, 0, KEYEVENTF_KEYUP, 0 );
        Sleep(czas);
  }
  keybd_event( 'X', 0, 0, 0 );
  keybd_event('X', 0, KEYEVENTF_KEYUP, 0 );
  Sleep(czas);
  keybd_event( 'X', 0, 0, 0 );
  keybd_event('X', 0, KEYEVENTF_KEYUP, 0 );  
  Sleep(czas);

  keybd_event( VK_RETURN, 0, 0, 0 );
  keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0 );  
  Sleep(czas);

  keybd_event( VK_F10, 0, 0, 0 );
  keybd_event(VK_F10, 0, KEYEVENTF_KEYUP, 0 );
  Sleep(czas);
...
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Sleep(4000);
  Timer1->Enabled = true;
}

Jest jakis sposob zeby to dzialalo w aplikacji pod DOS-em?

// dadałemem tagi code (dop. deus)

0

mam pewna watpliwosc dot. samego sensu.. w DOS nie ma zadnego mechanizmu z windowsow w stylu kolejek wiadomosci itp, tak wiec chyb adosc trudno zeby keybevent dzialal.. ale popraw mnie ktos, bo sie w ten sposob nie bawilem nigdy

0

Dla scislosci : aplikacja jest dosowa uruchamiana w systemie windows XP (okienkowo).

0

Dla ścisłości Morphling to nie masz pojęcia o tym - to jest konsolowa aplikacja Win32, bazuje na plikach PE co najmniej w wersji 3.5 a nie program DOS'owy. Od kiedy Delphi w ogóle umożliwia tworzenie od DOSa?

0

Widze nie zrozumiales mnie. Potrzebana mi jest aplikacja win32 (w BCB nie Delphi, co idzie zauwazyc po : tmp =Term->Text; btw sorki za brak [jezyka] w nazwie) symulujaca naciskanie klawiszy(niektore wartosci ma stale lub zalezne od IF, a niektore kopiuje z pola Edit do stringa). Uzywam wrednego programu do ksiegowania pisanego w Clipper, dzialajacy pod dosem w windows XP, gdzie musze za kazdym razem wciskac ten sam schemat klawiszy i wartosci (miedzy innymi 15x enter) przy czym zmieniaja sie tylko 2 pozycje(kwota i dla kogo).Program (napisany w c++) dziala w notatniku, i gdy w polu uruchom wpisze "cmd"(pojawia sie to czarne okienko, tam tez wpisuje ciagi znakow "wirtualnymi nacisnieciami klawiszy") , ale gdy otwoze dosowy edytor (po wpisaniu edit za znakiem zachety) juz nie reaguje(tak jak w programie do ktorego ma to byc pomocne). Da sie to zrealizowac w c++?.

0

swoja droga, rzeczywiscie ciekawy problem.. wezmy starego Prehistoryka albo UGH'a, odpalmy pod winda i jak temu czemus zasymulowac wciskanie klawiszy? na message'e nie bedzie reagowac, no bo jak..

..sluchaj - a czy przypadkiem ta Twoja aplikacja nie pracuje pod piecza ntvdm.exe? sprawdz jakims taskmanagerze lepszym, np. ProcessExplorer z www.microsoft.com/technet/sysinternals/ - moze nalezaloby message udajace naciskanie klawichy wysylac do ntvdm a nie aplikacji?

ah.. i nie wydaje mi sie jendak zeby (jesli rzeczywiscie 16bit aplikacje na message nie reaguja) to byl do temat do newbie, raczej do c++ lub nietuzinkowych..

0

Hm... a od czego są strumienie? Można z tego co pamiętam i tak otwierać aplikacje DOSowe poprzez CreateProcess, handle stdin i stdout powinny się na coś przydać, w końcu przerwania są emulowane.
Swoją drogą przepraszam, nie popatrzyłem nawet dokładnie na kod, jak tylko zobaczyłem Form1 to przyjąłem założenie, że to delphi, sporo różnych dziwnych tematów z d. juz jest :/

Przenoszę do innych.

0

Ew. można wysłać naciśnięcia klawiszy do okna konsoli (WM_KEYDOWN etc).

0

Ten sam kod będzie działać.
Dodaj tylko #include <windows.h>
Noa zamiast timera zrób pętle, w której na końcu będzie długi Sleep (tak długi jak intervval timera po odjęciu pozostałych sleepów)

Gynvael Coldwind napisał(a)

Ew. można wysłać naciśnięcia klawiszy do okna konsoli (WM_KEYDOWN etc).
Raczej chodzi o wysłanie klawiszy do innego programu.

// do programu dosowego, więc i tak przez okno konsoli przechodzą (dop. deus)

0

quetzalcoatl sprwadzilem i pracuje pod piecza ntvdm.exe. Tylko moje pytanie jak teraz wysylac message udajace naciskanie klawszy? Moje rowiazanie zakladalo, ze wpisuje co potrzebuje w Edity klikam na buton - Start - i 4 sekundowy Sleep daje mi czas na przelaczenie jako aktywne okno program, ktory mnie interesuje.

adf88 Chyba cie nie zrozumialem bo cos nie dziala. Dodalem <windows.h> i pozbylem sie timera. A to kod(jego zadaniem jest "wciskanie" takich klawiszy jak tekst w Edit1) :

#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String tmp;
  char c;
  int op;
  Sleep(4000);
  tmp =Edit1->Text;
  for(int i=1; i<=tmp.Length(); i++)
  {
        c = tmp[i];
        op = TextToShortCut( c );
        keybd_event( op, 0, 0, 0 );
        keybd_event( op, 0, KEYEVENTF_KEYUP, 0 );
        Sleep(200);
  }
}

deus, Gynvael Coldwind <ort>mogli byscie</ort> przytoczyc jakis przyklad?

Btw. dzieki za zainteresowanie :)

0

Morphling - to zdecyduj się, okienko czy konsola. W okienku Timer, w konsoli Sleep. No a nie działa, bo nie ma KEYDOWN

// do programu dosowego, więc i tak przez okno konsoli przechodzą (dop. deus)</i>

W notatniku dziala bez problemu.
Tak więc chodziło CHYBA o wysłanie do okienka np notatnika.

1 użytkowników online, w tym zalogowanych: 0, gości: 1