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

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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
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
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
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

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

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.

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.

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