Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi stisknuti klaves

Ahoj, potřeboval bych poradit, jak v delphi simulovat stisknuti klaves.

Dam priklad.

Chci aby delphi za me prepinal zalozky v prohlizeci, pomoci kombinace CTRL TAB.. Jak na to?

Urcite ten kod dam do timeru, ale jaky? Nejaky navod? Rada..Diky

Předmět Autor Datum
posles oknu prehliadaca prislusne windows messages, napr. WM_KEYDOWN, WM_KEYUP. Podrobnosti su na MS…
MM.. 23.11.2012 15:23
MM..
Nie je to až také zložité, ale zas ani úplne jednoduché. :-) uses tlhelp32; type PEnumInfo = ^TEnum…
pme 23.11.2012 18:19
pme
Prosim a je mozne toto riesit este globalnejsie takmer az na urovni hardwaru? Mam totiz zopar aplika…
host Stefan 16.05.2015 19:11
host Stefan
A co je to za aplikace, která nepracuje s frontou zpráv Windows? Napadají mne pouze nějaké konzolové…
Jan Fiala 16.05.2015 19:42
Jan Fiala
Jde napriklad naprogramovat Arduino, aby se tvarilo jako USB klavesnice a posilalo ti stisky klaves.…
gilhad 17.05.2015 10:50
gilhad
Ide o aplikácie typu audio games čo sú hry pre zrakovo postihnutých. Celkovo ich nie je veľa a tie č…
Stefan77 18.05.2015 15:56
Stefan77
Audiohry, ktoré používajú Directx aha... potom sa zameraj na DirectInput - Delphi to zvláda, Google…
pme 18.05.2015 20:06
pme
dxinput používam práve pomocou neho odchytávam povely z jojstycku a písal som, že hry, ktoré idú cez…
Stefan77 22.05.2015 19:07
Stefan77
Jestli jsi z Prahy a okoli (nebo obcas mas cestu) tak ti muzu ukazat jak snadno se s takovym Arduine…
gilhad 19.05.2015 10:50
gilhad
jeej vdaka za ponuku To sa ale ak tomu spravne rozumiem pohybujeme na urovni hardwaru, teda kable a…
Stefan77 22.05.2015 19:12
Stefan77
Já si to představuju takhle: - potřebujeme joystick, aby bylo čím hýbat. Joystiky teď obvykle mají U…
gilhad 22.05.2015 22:04
gilhad
mluvil jsem s kamaradem, rikal, ze ti mam rict, at se podivas na joy2key (ja sam ho neznam a dodnes…
gilhad 24.05.2015 14:18
gilhad
Tak ten Joy2key je uplne skvely uz som ho aj kupil. Je to presne to co som chcel sam programovat a f… poslední
Stefan77 25.05.2015 07:48
Stefan77
Snad by to šlo bezpracně vyřešit utilitami typu HotkeyP nebo AutoIt, ne?
host 23.11.2012 18:22
host

posles oknu prehliadaca prislusne windows messages, napr. WM_KEYDOWN, WM_KEYUP. Podrobnosti su na MSDN (msdn.microsoft.com). Priprav sa na to ze si nastudujes aspon 100 stran v anglictine kym v tom budes mat jasno (napr. ze jak najst handle okna prehliadaca pomocou FindWindow apod)

Nie je to až také zložité, ale zas ani úplne jednoduché. :-)

uses tlhelp32;

type
  PEnumInfo = ^TEnumInfo;
  TEnumInfo = record
  ProcessID: DWORD;
  HWND: THandle;
  end;

function GetProcessID(ProcessName:string):Integer;
var
  Handle: tHandle;
  Process: tProcessEntry32;
  GotProcess: Boolean;
begin
  Handle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0) ;
  Process.dwSize:=SizeOf(Process);
  GotProcess := Process32First(Handle,Process);
{$B-}
  if GotProcess and (Process.szExeFile<>ProcessName) then
  repeat
    GotProcess := Process32Next(Handle,Process);
  until (not GotProcess) or (Process.szExeFile=ProcessName);
{$B+}
  if GotProcess then Result := Process.th32ProcessID
  else Result := 0;
  CloseHandle(Handle);
end;

function EnumWindowsProc(Wnd: DWORD; var EI: TEnumInfo): Bool; stdcall;
var
  PID: DWORD;
begin
  GetWindowThreadProcessID(Wnd, @PID);
  Result := (PID <> EI.ProcessID) or (not IsWindowVisible(WND)) or
                (not IsWindowEnabled(WND));
  if not Result then EI.HWND := WND; //break on return FALSE
end;

function FindMainWindow(PID: DWORD): DWORD;
var
  EI: TEnumInfo;
begin
  EI.ProcessID := PID;
  EI.HWND := 0;
  EnumWindows(@EnumWindowsProc, Integer(@EI));
  Result := EI.HWND;
end;

function GetProcessHandle(str: string): THandle;
var
  PID : Integer;
begin
  PID:=GetProcessID(str);
  Result:=FindMainWindow(PID);
end;

procedure TForm7.Timer1Timer(Sender: TObject);
var
  Hx: THandle;
begin
   Hx := GetProcessHandle('firefox.exe');
   if hx <> 0 then
   begin
     SetForeGroundWindow(hx);
     keybd_event(VK_CONTROL, 1,0,0);                  //Send Ctrl down
     keybd_event(VK_TAB, 1,0,0);                      //Send Tab down
     keybd_event(VK_TAB, 1,KEYEVENTF_KEYUP,0);        //Send Tab up
     keybd_event(VK_CONTROL, 1, KEYEVENTF_KEYUP,0);   //Send Ctrl up}
   end;
end;

Napísané a testované mnou pod DELPHI XE2 na WIN7-64...

Prosim a je mozne toto riesit este globalnejsie takmer az na urovni hardwaru? Mam totiz zopar aplikacii, ktore na simulaciu stlacenia klavesy cez win api vobec nereaguju a pracuju len po fyzickom stlaceni klavesy na klavesnici z coho usudzujem, ze odchytavaju stlacene klavesy nejako priamo a nie cez keydown a keyup systemu. Ako by sa to dalo teda este inak riesit? Vdaka

Jde napriklad naprogramovat Arduino, aby se tvarilo jako USB klavesnice a posilalo ti stisky klaves. Pro PC to je proste dalsi HW klavesnice, neni jak to rozlisit (krome testu na jmeno vyrobce te klavesnice), aplikace nemaji sanci. Na druhou stranu muze komunikovat i po dalsich kanalech, kudy tomu budes posilat, co ma delat (treba jake klavesy stisknout). Akorat to neni zase tak zcela jednoduche a urcite to neni na vysvetlovani v poradne.

MouseKeyboard

http://www.arduino.cc/en/Tutorial/KeyboardAndMouse Control

pripadne googli "arduino keyboard emulator" ... najdes spoustu zajimavych veci

Ide o aplikácie typu audio games čo sú hry pre zrakovo postihnutých. Celkovo ich nie je veľa a tie čo sú, sú spravidla pre klávesnicu, preto som si urobil v Delphi utilitku, ktorá cez delphix odchytáva polohu páky a tlačidiel jojstycku a podla nich simuluje stláčanie kláves, takže nevidomý si môže zahrať audiohru s jojstyckom, hoci táto pôvodne preň nemá podporu. Audiohry, ktoré používajú Directx ako napríklad Super egg hunt

seh.php
idú bez problémov, no spravidla je u nich ten problém, že kolidujú s čítačmi obrazoviek, ktoré nevidiaci používajú, preto pri ich hraní treba čítač vypnúť, aby neblokoval klávesnicu. Novšie hry sa túto kolíziu snažia riešiť, preto u nich už netreba vypínať čítač obrazovky, no nereagujú ani na správy z windows. Javia sa, ako keby priamo odchytávali stlačené klávesy a nič iné si nevšímali, takže ani globálne povely čítača obrazovky ako je prečítanie titulku okna alebo len aktuálneho času nefungujú a nereagujú ani na simulované stlačenie klávesnice. Príkladom je napr. Slide

free.php

ale aj mnohé iné inak veľmi dobré akčné audiohry. Možno o tom ani neviete ale aj bez zraku je možné bojovať so zombíkmi, plniť misie v leteckom simulátore alebo si zahrať audioverziu Slendermanna. Hrať ich ale s jojstyckom je trochu iné ako s klávesnicou, preto som sa pokúšal riešiť tento problém no cez keybevent to evidentne nepôjde a možno niečo také ako Arduino o ktorom písal Gilhad by bolo riešením, kedy by aplikácia pracovala až na úrovni emulátora hardwaru. No neviem či som na Arduino dorástol, takže každý nápad uvítam a vopred ďakujem.

dxinput používam práve pomocou neho odchytávam povely z jojstycku a písal som, že hry, ktoré idú cez Directx sú bez problémov ale sú také, ktoré správy keydown a keyup ignorujú. Preto by asi jediným riešením bolo programovať niečo ako virtuálnu klávesnicu na úrovni hardwaru cez nejaký virtuálny port. Pre iné platformy som také riešenie na Google aj kdesi zahliadol, no nie pre Delphi.

Jestli jsi z Prahy a okoli (nebo obcas mas cestu) tak ti muzu ukazat jak snadno se s takovym Arduinem dela (i kdyz misto Una bych spis pouzil Mini/Mikro, ktere je kompaktnejsi a pro tento ucel vhodnejsi, nebo rovnou navrhnul desku s ATMEL procesorem) - porad se pohybujeme v radu nizkych stokorun.

U toho joystiku patrne staci nekolik pismen na kazdou osu (trochu dopredu=A, vic dopredu=B, uplne dopredu = C, nebo tak nejak) takze se da do nej celkem snadno napichnout dovnitr vlastnimi draty (a obejit jeho USB interface) a pak to zapojeni je slozite asi tak jako to na obrazku - par odporu, par dratu, misto spinacu ten joystick.

Uz jsem se takhle "vlamal" do gamepadu a naprosto v pohode ho upravil k obrazu svemu (jenze tam slo o opacny problem - prevest 9 tlacitek na desce 1x1 metr na USB zarizeni snadno a rychle, pro ucely hrani Stepmanie).

S takovymhle projektem pomuzu velice rad

(kontakt na me mas v poste)

jeej vdaka za ponuku To sa ale ak tomu spravne rozumiem pohybujeme na urovni hardwaru, teda kable a fyzicka uprava zariadenia. . Neslo by ale iba softwarovo simulovat hardware? Teda klavesnicu? Tejto oblasti az tak moc nerozumiem preto sa tak blbo pytam :d ale ak mam napr bluetoth klavesnicu a stlacim sipku, system dostane spravu, ze bola stlacena sipka. Pokusal som sa najst nieco o tom, ci nie je mozne napr cez nejaky virtualny port programovat virtualny hardware aby sprava ze bola stlacena sipka do systemu dorazila rovnako ako ked dorazi z usb portu alebo z bluetoth zariadenia.

Já si to představuju takhle:
- potřebujeme joystick, aby bylo čím hýbat. Joystiky teď obvykle mají USB rozhraní, což není tak jednoduché na správné provedení (ten protokol je dost složitý, potřebuješ spc. HW na komunikaci atd atd.), takže to prostě všechno obejdu, ten joystick má uvnitř dva potenciometry a pár tlačítek, já k nim připojím drátky a vyvedu si to ven.

- venku bude Arduino, do toho ty drátky strčím a dál už je to všechno SW v jednoduchém Cčku s plnou podporou knihoven.
(V tom příkladu co jsem pastnul to čte tlačítka (digitalRead(pin) = 1/0 pokud je/není stisknuto) pro ty potenciometry se obdobně použije analogRead(pin) = 0..4095 (nebo tak nějak), podle toho v jaké poloze je.)

Ten program bude vlastně úplně stejný jako ten příklad, jen tam bude víc větví (pro každé tlačítko a pro každý rozsah potenciometru).

(jde o tuhle část:

  // use the pushbuttons to control the keyboard:
  if (digitalRead(upButton) == HIGH) {
    Keyboard.write('u');
  }
  if (digitalRead(downButton) == HIGH) {
    Keyboard.write('d');
  }
  if (digitalRead(leftButton) == HIGH) {
    Keyboard.write('l');
  }
  if (digitalRead(rightButton) == HIGH) {
    Keyboard.write('r');
  }
  if (digitalRead(mouseButton) == HIGH) {
    Keyboard.write('m');
  }

)
O zbytek se postarají standardní Arduino knihovny.

Takže tu máme joystick, z něj vede jeden vícežilový kablík k malé krabiččce s Arduinem, která je připojena do USB portu počítače (notebooku, tabletu ..). Počítač vidí další USB klávesnici a občas mu z ní přijde, že někdo stisknul nějaké písmenko, stejně jako je tomu u jakékoli jiné USB klávesnice.

Co se programování týče, tak to může být tak jednoduché, jako v tom příkladu, nebo si tam můžeš dopsat, cokoli tě napadne (autorepeat, klidne i s rychlostí měnící se podle úhlu páky, makra, nebo cokoli jiného, fantasii se meze nekladou.)

Se SW simulováním HW přímo v dotyčném počítači je ten problém, že musíš jít hodně hluboko a stejně to může nějaká hra obejít, tím, že půjde na úroveň ovladače a bude si číst ty porty sama - což už nepřeprogramuješ (aspoň ne čistě a přitom rozumně snadno). Tady bychom simulovali tu HW USB klávesnici v jednoduchém prostředí, které máme plně pod kontrolou a dělá se to nepoměrně snáz, než ve Windows, a přitom z hlediska počítače jsme naprosto "normální USB klávesnice" a to už na úrovni průběhu napětí na USB portu - to žádný program neobejde, protože my tak USB klávesnice podle všech myslitelných kritérií doopravdy jsme.

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