Reakcja na dowolny klawisz niezależnie od aktywności okna

4

Witam!!
Próbuję stworzyć program działający na styl tego co jest w windowsie, że gdy pojawia nam się wygaszacz ekranu, to potem pojawia nam się ekran logowania w którym odblokowujemy komputer. Jak dla mnie pozostawia to wiele do życzenia więc postanowiłem stworzyć samemu coś co działałoby w ten sam sposób. Na razie mój program działa poprawnie gdy poruszamy myszą, lecz nie uwzględnia on tego czy korzystamy z klawiatury czy nie. I tu właśnie pojawia się moje pytanie - w jaki sposób można zrobić, aby program wykonywał różne funkcje lub procedury po naciśnięciu dowolnego klawisza niezależnie od tego czy nasz program jest aktywny czy nie (bo jak wiadomo - gdy w OnKeyDown formy damy np.: if key=x then cośtam to po naciśnięciu klawisza "x" zostanie wykonana prcedura/funkcja "cośtam" tylko i wyłącznie wtedy gdy okno jest aktywne bo na nie na przykład wcześniej kliknęliśmy)??

Z góry dziękuję za pomoc!!

0

Sposobów jest wiele. Najprostszy to globalny Hook na klawiaturę. Innym może być dodanie HotKeyów, ale żeby one działały globalnie na przykład w pełno ekranowej grze DirectX, a nie tylko w typowo okienkowych aplikacjach należało by sobie w wątku sprawdzać wciskane klawisze i wysyłać do swojej aplikacji komunikat WM_HOTKEY. Na takiej zasadzie działa na przykład program Cheat Engine i HotKey, które można w nim ustawić. Przykładów i gotowców nie wysyłam już, bo zniechęcił mnie jak pewnie wiesz - jeżeli czytasz forum - bezpodstawny zarzut o wysyłanie malware. Także więcej informacji czy gotowych kodów sobie wygoogluj. Mogę na koniec jedynie polecić wpis na moim blogu (link w sygnaturce) na temat tworzenia trainera dla gry Max Payne. Jest tam link do źródeł trainera w WinAPI, który właśnie wykorzystuje zaadoptowany moduł z VCL do WinAPI, który użyto w CE. Tylko, że ja go dodatkowo przeobiłem i dodałem do nazwy ver2, ponieważ teraz trainer reaguje tylko na pojedyncze naciskanie klawiszy. Czyli trzeba naciśnać na przykład F6 i żeby trainer ponownie na to zareagował musimy go puścić i możemy ponownie wciskać. Oczywiście w przypadku takich HotKeyów do gry, warto też sprawdzać czy aktywnym oknem jest okno gry, dla której trainer jest przewidziany. Oczywiście mój trainer to robi.

0

moim zdaniem prostszą formą jest wstawienie timera na forme i wpisanie:

if GetAsyncKeyState(vk_return) <0 then wcisnietoklawisz();

w Delphi pójdzie a w Lazarusie nie

możesz tak zrobić dla wszystkich klawiszy

pozdrawiam:)

0
tweety napisał(a):

moim zdaniem prostszą formą jest wstawienie timera na forme i wpisanie:

if GetAsyncKeyState(vk_return) <0 then wcisnietoklawisz();

w Delphi pójdzie a w Lazarusie nie

możesz tak zrobić dla wszystkich klawiszy

pozdrawiam:)

w lazarusie też pójdzie tylko trzeba dopisać Windows do sekcji uses domyślnie jest on wyłączony

0
tweety napisał(a):

w lazarusie też pójdzie tylko trzeba dopisać Windows do sekcji uses domyślnie jest on wyłączony

W Lazarusie jest on domyślnie wyłączony nie bez powodu, jeżeli nie chodzi nam o nic większego to OS-independent wrappery ma np. LCLIntf, radzę poczytać zamiast ślepo używać tego samego co w Delphi (na dodatek dziwiąc się że nie ma domyślnie włączonego unitu Windows - to nie jest jednoplatformowe Delphi).

1

Jest jeszcze inna metoda.
Możesz w TTimer cały czas sprawdzać (co 1sek.), czy Twoja aplikacja jest aktywna (na wierzchu). Albo bez sprawdzania cały czas ją przełączać na pierwszy plan. W ten sposób żadne inne aplikacje nie przebiją się, bo Twoja będzie przebijała je.

Odpada wtedy zabawa w skróty klawiaturowe, chociaż nadal istnieje możliwość włączenia menedżera zadań i ubicia Twojego procesu.

0

najlepszym rozwiazaniem bedzie hook WH_KEYBOARD umieszczony w dll

0
greenmag napisał(a):

najlepszym rozwiazaniem bedzie hook WH_KEYBOARD umieszczony w dll

Najlepsze bo pracochłonne i ciężkostrawne dla systemu? Już nie mówiąc o tym że wiele antywirusów nie będzie lubiło twojego rozwiązania.

Możesz w TTimer cały czas sprawdzać (co 1sek.), czy Twoja aplikacja jest aktywna (na wierzchu). Albo bez sprawdzania cały czas ją przełączać na pierwszy plan. W ten sposób żadne inne aplikacje nie przebiją się, bo Twoja będzie przebijała je.

Nie ma to jak za rozwiązanie zabrać się od d**y strony.

Ja się głupio spytam czemu nie GetKeyState?!? Bo to za proste?! Bo nie ma eventu gdy klawisz leci? Może w takim razie warto napisać rootkita bo tak to może i system zmieni event, albo inny rootkit przechwyci i zmieni?! Do wszystkiego piszmy rootkity, każdy lubi gdy mu się system rozdupca, a to waląc 100 nowych kluczy do rejestru, a to dodając globalną dllkę, może rootkity też dodawajmy do kalkulatora (ze względu na szybszą reakcję programu). Uwielbiam to myślenie, że skoro muszę znaleźć klawisza to od razu powinienem napisać globalnego hooka i dziwić się że antywirusy tego nie lubią... No ale cóż się dziwię, prawdziwego WTF doznałem gdy program tak szanowanego użytkownika jak @Patryk27 przy każdym starcie usiłował zaśmiecić rejestr swoim rozszerzeniem... Eh.

0

"Najlepsze bo pracochłonne..." - dla ciebie moze i pracochlonne, ale dla tych ktorzy to umieja zrobic to kilka linijek kodu

Umiem to zrobić, i wiem że jest to pracochłonne, zwłaszcza w porównaniu do użycia WinAPI. No ale gdzie ja się znam. Przecież mówi do mnie osoba która uważa że łatwiej zrobić hook niż użyć WinApi i liczy skomplikowanie kodu w liniach. Już nie mówiąc o tym że na resztę argumentów które wymieniłem jest totalnie ślepy.
Mam się śmiać?

0

pracochlonnosc to nie trudnosc, brak pracochlonnosci to nie latwosc. to ze cos zabiera sporo czasu to nie znaczy od razu ze jest trudne a po prostu pracochlonne, niekoniecznie musza to byc sprawy wysilajace mozg (jak dla mnie to taki hak nie jest ani trudny ani tez pracochlonny). a ty twierdzisz ze zaloznie hak jest pracochlonne.

Trudne <> Wysilające mózg. Trudne oznacza skomplikowane. Skomplikowane zazwyczaj oznacza pracochłonne. Przestań twierdzić że nie rozumiesz.
Założenie hooka jest pracochłonne i trudne. Zwłaszcza w porównaniu do innych metod. No ale dla ciebie względność to coś niepojętego... Lepiej po prostu twierdzić że to zależy od programisty i zarzucić nieumiejętność programowania, czyż nie?

a ja z kolei nigdzie nie napisalem ze latwiej uzyc haka niz winapi.

Skoro napisałeś że hooki nie są pracochłonne to oczywiste było że odnosiłeś się do innych metod, więc stwierdziłeś że albo jest łatwiejsze albo podobnie pracochłonne. Co jest nonsensem. No ale przecież to ja nie umiem czytać, nie ty pisać.

wszedzie masz do powiedzenia najwiecej a nie potrafisz czytac ze zrozumieniem

Wszędzie mam do powiedzenia najwięcej? Nie no bardzo ciekawe, czy znajdziesz chociaż jeden mój post w dziale np. Java? Ale to się nie zalicza do wszystkiego, czyż nie?
Najłatwiej zarzucić nieumiejętność czytania ze zrozumieniem, kiedy samemu się nie umie czytać ze zrozumieniem ani pisać z sensem.

pozdrawiam

:* (Na to powinna być emotka, nawet/zwłaszcza na forum programistycznym)

Patryk27 napisał(a)

Przecież poprawiłem to w następnych wersjach :P Po prostu rozwiązanie z którego skorzystałem było "prostsze" i wpadło mi na myśl jako pierwsze :|

Wiem że poprawiłeś i wiem że było proste, ale niekoniecznie dobre. Podałem jako przykład :P .

0

ale się produkuje;) uważaj żeby Ci lapmpki nie rozsadziło... ;)

1

-123oho Mam do Ciebie wieeelką prośbę. Jeśli nie masz do powiedzenia niczego konstruktywnego (tzn. mogącego pomóc komuś) to się nie wypowiadaj bez sensu!! Zabierasz użytkownikom tylko czas na czytanie tego "co wielce jaśnie pan napisał bo został urażony tym, że ktokolwiek miał czelność uważać inaczej niż on, albo zapytać o coś czego nie umiał bądź nie mógł znaleźć w google". Takie wiadomości/posty nie wnoszą ludziom niczego nowego a tylko doprowadzasz ludzi do szału!!

0
Elhatron napisał(a):

Takie wiadomości/posty nie wnoszą ludziom niczego nowego a tylko doprowadzasz ludzi do szału!!

A patrzyłeś na swoją wypowiedź? Mistrz hipokryzji.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.