Przesyłanie klawiszy nie działa.

0

Witam
Jak w temacie.
Próbowałem już
keybd_event
SendInput
Sendmessage
Postmessage
i nic.
Na okna windosowe oczywiście działają te sposoby, ale ja potrzebuję wysłać klawisze do starego programu dosowego.
Klawiatura ekranowa windowsa sobie radzi.
Możecie podesłać mi pomysły na inne rozwiązania?

0

Zobacz czy tą klawiaturą będziesz mógł coś napisać w dosowym. Teraz mam pod ręką tylko W8 64bit i nie mam jak sprawdzić ale w CMD działa

0

To niemożliwe żeby SendInput nie działało. Testowałem poniższy kod pod: CMD, odpalonym bez CMD IDE kompilatora FPC w oknie konsoli, ConEmu i na końcu pod DOSBox'em. Bez problemów symulowało klawisze. Mój system to Windows 7 64 Bit PL. Być może program jest jakiś specyficzny, nie wiem jak go uruchamiasz.

procedure KeyDownUp(KeyToSend : Byte; KeyDown : boolean);
const
  DownUp_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_KEYUP);
  Extended_Flags_Arr : array[boolean] of DWORD = (0, KEYEVENTF_EXTENDEDKEY);
var
  Input : TagINPUT;
  KeyExtended : boolean;
begin
  Input.Itype := INPUT_KEYBOARD;
  Input.ki.wVK := KeyToSend;
  Input.ki.wScan := MapVirtualKey(KeyToSend, 0);
  KeyExtended := KeyToSend in [VK_CONTROL, VK_LCONTROL, VK_RCONTROL,
    VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME, VK_END, VK_PRIOR,
    VK_NEXT, VK_INSERT, VK_DELETE, VK_MENU];
  Input.ki.dwFlags := DownUp_Flags_Arr[not KeyDown] or Extended_Flags_Arr[KeyExtended];
  Input.ki.time := 0;
  SendInput(1, Input, SizeOf(Input));
end;

A i program, który dołączył @abrakadaber również działa bez problemów (sprawdziłem na szybko pod CMD).

0

Pod CMD to działa.
Niestety jak odpalam program do którego chcę wysłać klawisze to już nie. Sprawdzałem klawiaturę windosową (XP) i ta potrafi.
Prawdopodobnie inaczej opisali pobieranie klawiszy i dlatego nie działa, ale windows jednak sobie radzi więc musi być jakiś sposób.

0

Niestety podesłany program też nie działa.

0

@Sir_Chris - pamiętaj, że pisanie w kółko nie działa nic nie tłumaczy; Jako ktoś, kto chce programować, powinieneś używać sensowniejszych sformułowań;

Nie znam dokładnie konstrukcji klawiatury ekranowej w systemie, jednak podejrzewam, że równie dobrze można by za pomocą funkcji WinAPI pobrać uchwyt do aktywnego okna w systemie, i mając już jego uchwyt wysłać standardowe komunikaty wciśnięcia i puszczenia klawisza; Być może w ten sposób się uda, a przynajmniej ja bym też tego spróbował i w tym kierunku także pokombinował;

Jeśli nie wiesz jakich funkcji użyć, to poczytaj o GetActiveWindow i SendMessage.

0

Programuje od wielu lat.
Po raz pierwszy odbiłem się o temat którego nie mogę przejść. Dlatego postanowiłem zaczerpnąć od kolegów.
Oczywiście pisząc w pierwszym poście, że sprawdziłem sendmessage i postmessage to oznacza, że je przetestowałem.
Może opisałem to zbyt mało szczegółowo, ale wydaje mi się, że programiści by mnie zrozumieli.

Wracając do sprawy.
Program jest stary, bazodanowy, oparty jeszcze na dbfach, nie wiem w czym był pisany (być może DBASE, nie wygląda na c i na pascala). Dlatego przypuszczam, że trochę inaczej niż standardowo rozwiązano tam sposób pobierania klawiszy. Co prawda w windowsach nie ma bufora klawiatury, ale cmd pewnie go symuluje. Może da się do niego dobrać.

Na inne programy DOS-owe, do których pisywałem takie "klikacze", standardowe metody działały. Dlatego pytam czy znacie inne rozwiązania.

Pozdrawiam.

0

Odpalam go standardowo z cmd lub ze skrótu. Program, z którym się mierzę, na systemach 64 bitowych nie odpala się wcale. Dlatego testuję go na XP. Jeżeli, któryś z kolegów miałby czas i ochotę zająć mogę podesłać instalkę.

0

Co prawda w windowsach nie ma bufora klawiatury, ale cmd pewnie go symuluje. Może da się do niego dobrać.
Pewnie że się da, pisząc DOS-owego TSR-a ładowanego w tej samej konsoli przed uruchomieniem programu.

0

Dobry pomysł, zaraz przetestuję.

0
Program TSR;

{ TSR Demo                      }
{ (c) Jul 94 Luis Mezquita Raya }

{$M $1000,0,0}

uses  Crt,Dos;

var   OldInt09h:procedure;

Procedure EndTSR; assembler;
asm
                cli
                mov AH,49h
                mov ES,PrefixSeg
                push ES
                mov ES,ES:[2Ch]
                int 21h
                pop ES
                mov AH,49h
                int 21h
                sti
end;

{$f+}
Procedure NewInt09h; interrupt;
var k:byte; kb_exit:boolean;
begin
 k:=Port[$60];
 kb_exit:=False;
 if k<$80
 then begin
       Sound(5000);
       Delay(1);
       NoSound;
      end
 else if k=$CE                          { $4E or $80 }
      then kb_exit:=True;
 asm pushf end;
 OldInt09h;
 if kb_exit
 then begin
       Sound(440);
       Delay(15);
       NoSound;
       SetIntVec(9,@OldInt09h);
       EndTSR;
      end;
end;
{$f-}

begin
 GetIntVec(9,@OldInt09h);
 SetIntVec(9,@NewInt09h);
 Keep(0);
end.
>--- cut here -----------------------------------------------------

        When you run this program you get a key-click each time you
press a key but TSR program discharges if you press the big '+' key
(at numeric keyboard).

                   Greetings,
                            Luis
 
0

Może http://www.tek-tips.com/viewthread.cfm?qid=899078 będzie przydatne?

Tylko nie wiem jak znaleźć uchwyt do do programu dosowego.

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