Program do robienia zrzutów ekranu - odczyt klawiszy

0

Wiem że tego na forum jest pełno, przeczytałem prawie wszystkie tematy odnośnie przechwytywania klawiszy, odczytu itp, ale nic niestety mi nie pomogło.

Korzystałem już z:

 GetAsyncKeyState(); 

użytym w timerze ale czasem klawisz odczyta, czasem nie.

Oraz z:

procedure TFormMain.FormCreate(Sender: TObject);
begin

  // Hook Keyboard
  RegisterHotKey(Handle,$0001,0,VK_SNAPSHOT);
  RegisterHotKey(Handle,$0002,0,VK_VOLUME_UP);
  RegisterHotKey(Handle,$0003,0,VK_VOLUME_DOWN);

end;

procedure TFormMain.LockKeyPress(var Msg: TMessage);
begin

  if Msg.wParam=$0001 then begin
    showmessage('printscreen');
  end;
  if Msg.wParam=$0002 then begin
    showmessage('volume+');
  end;
  if Msg.wParam=$0003 then begin
    showmessage('volume-');
  end;

end;

gdzie klawisze po prostu zostały mi odebrane z działania w innych programach na rzecz tego jednego.

Moim problemem jest użycie klawisza PrintScreen oraz na raz klawiszy Vol+ i Vol- gdyż chcę stworzyć uniwersalny program do robienia zrzutów ekranu. Klawisze Vol+ i Vol- dlatego, gdyż kupiłem sobie tablet z Windows 8.1 i niestety takiej funkcji robienia zrzutu tam nie ma jak w Androidzie czy Windows Phone, a podłączanie zewnętrznej klawiatury wymaga trochę nakładu pracy. Naciśnięcie klawiszy Vol+ i Vol- jednocześnie byłoby dobrym rozwiązaniem, mógłbym użyć też przycisku ACPI ale z nim pewnie by było więcej problemów.

0

jak chcesz mieć pewność, że złapiesz dane klawisze to pozostaje jedynie globalny hook na klawiaturę. Niestety RegisterHotKey ma to do siebie, że nie zarejestruje kilku skrótów na ten sam klawisz

0

Tylko że blokując klawisze głosu, nie mogę nic w zasadzie z dźwiękiem zdziałać, a to jedyne klawisze na obudowie które mogę użyć

1

Przecież Hook globalny low levelowy na klawiaturę nie musi blokować klawisza. Można nie ustawiać rezultatu dla funkcji obsługi Hooka na jeden, tylko zwracać rezultat normalnie poprzez CallNextHookEx czyli puścić dalej "w świat" to co wciśnał user. Inne rozwiążanie jeżeli nie chcesz lowlevelowego Hooka ze względu na upierdliwe UAC. To tak jak wspominałeś GetAsyncKeyState w wątku z krótkim Sleepem. Pobierz sobie z mojego bloga kod trainera jaki napisłem w WinAPI i Delphi 7 do Maxa Payna. Tam masz gotowy moduł bazujący na rozwiązaniu wziętym z kodu źródlowego Cheat Engine 5.6. Tylko że ta ver2 jest dopasowana aby po wciśnięciu klawisza, do moment jego puszczenia nie reagował na trzymanie. Tak chciałem by działało, ale nie problem przerobić sobie kod.

0

@chkam pisałem jakiś czas temu aplikację w Delphi na tablet z win 8.1 i z hookami też miałem mnóstwo problemów - przykład: Dlaczego nie działa globalny hook na WM_MOUSE w Internet Explorerze?
Z rzeczy, które pamiętam z głowy to Twoja aplikacja powinna znajdować się np na dysku C bo w gdy znajduje się np na pulpicie to wchodzi UAC, który blokuje mnóstwo rzeczy. Ja w moim przypadku instalator zrobiłem na dysk C i część problemów się rozwiązała. Ponadto jeśli jest to tablet to wiem, że samo zdarzenie KeyPress/Down/Up/Move itd. też nie zawsze działały dlatego dorobiłem obsługę WM_TOUCH
http://4programmers.net/Forum/Delphi_Pascal/160105-jak_zrobic_globalny_hook_na_wm_touch
Ponadto w mojej aplikacji był problem o tyle, że jak był odpalony IE i strona z apletem JAVY to żaden skrót nie chciał działać bo aplet i IE miały jakieś swoje dziwne hooki i nic nie działało. Tematu nie rozwiązałem ale obszedłem w mniej elegancki ale skuteczny sposób.

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