Reakcja na wciśnięcie klawisza niezależnie od focusa

0

Witajcie
Właśnie zarejestrowałem się na waszym forum i szukam odpowiedzi na nurtujący mnie problem. Nie znalazłem jak dotąd odpowiedzi dla języka C#. Otóż piszę program, który chcę, aby reagował na wciskanie odpowiednich klawiszy na klawiaturze, ale niezależnie, jaka kontrolka ma aktualnie focus, a nawet niezależnie od tego, czy aktualnie aktywnym oknem jest to mojego programu, czy zupełnie innego. Czyli po prostu program ma reagować zawsze, gdy zostanie kliknięty dany klawisz. Jedyne, co umiem zrobić, to reagować na klikanie przy focusie danej kontrolki odpowiednim zdarzeniem, ale to mi nic nie daje.
W C# programuję od niedawna, ale mam spore doświadczenie w C++, więc ogólnie programowanie nie jest mi obce. Z góry dziękuję za pomoc!

0

Nie, nie keylogger :) To ma być program do obsługi konkretnie napędu do ustawiania ostrości w teleskopie i chciałem, żeby można było nim sterować nie tylko przyciskami w okienku, ale też z klawiatury. W C++ umiałem uzyskać ten efekt, ale chciałem napisać to w C#.

FakeAccount, dzięki, to jest to :) Mam tylko jeszcze głupi problem "techniczny". Dodałem ten projekt do mojego, dodałem dyrektywę using Gma.UserActivityMonitor;, dodałem w moim projekcie odwołanie do tamtego i po skompilowaniu mam błąd:
Błąd 1 Generowanie zestawu nie powiodło się — Zestaw 'Gma.UserActivityMonitor', którego dotyczy odwołanie, nie ma silnej nazwy.
A może trzeba jakoś dodać sam skompilowany plik dll? Tylko nie wiem jak.
Piszę w VisualStudio 2012.

0

Wiesz w jakim procesie mają być klikane te klawisze?
W C# można zaimportować sobie biblioteki z winapi.
Chyba powinieneś googlać frazą "register global hotkey"

0

No po angielsku brzmi to raczej tak samo :)
Error 1 Assembly generation failed -- Referenced assembly 'Gma.UserActivityMonitor' does not have a strong name
No jak to w jakim procesie, no w moim :) Rozwiązanie podane przez FakeAccount wydaje mi się idealne, nie trzeba kombinować z bibliotekami winapi. Mam tylko problem z tym, jak dodać tamten projekt do mojego. Nie wiem, czy mam po prostu dołączyć cały projekt, same pliki źródłowe, czy może skompilowaną bibliotekę.

0

Ten projekt właśnie korzysta z WinApi i bawi się w tymi bibliotekami.
Jak chcesz żeby dll'ka z tego projektu miała silną nazwę to pobranie źródeł, skompilowanie sobie ich samemu razem z podpisaniem (okienko właściwości projektu w VS) może pomóc.

0

Dzięki. Dodałem ten plik do podpisu i udało się skompilować. Ale jest kolejny problem. Przy dodawaniu metody obsługi zdarzenia rzucany jest wyjątek "Nie można odnaleźć określonego modułu". Wyjątek wyskakuje przez tą linijkę: HookManager.KeyUp += HookManager_KeyUp;, a konkretnie wyskakuje w metodzie EnsureSubscribedToGlobalKeyboardEvents() w pliku HookManager.Callbacks.cs. Robię wszystko dokładnie, jak w projekcie przykładowym, a jednak nie działa.
Oczywiście zdefiniowałem swoją metodę HookManager_KeyUp.

0

Kopiujesz dll'kę do katalogu gdzie masz skompilowany exe, który z niego korzysta?
I z tym odinstalowaniem pakietu językowego to było na serio, łatwiej korzystać z googla kiedy masz błędy w języku jak większość programistów.

0

Wtedy dołączyłem cały projekt do mojego. Teraz usunąłem projekt i skopiowałem, jak mówisz sam plik dll do folderu z moim exe i dodałem odwołanie od niego. Efekt jest taki sam, wyskakuje wyjątek. Wydaje mi się, że "technicznie" wszystko jest już ok, tylko źle korzystam z biblioteki. No ale czy mam tam zrobić coś jeszcze zanim ustawię to zdarzenie wspomnianym poleceniem? W przykładowym programie jest tylko tyle.
Pakietu nie muszę odinstalowywać, mogę sobie w dowolnej chwili zmienić język :) Masz rację, że łatwiej znaleźć błąd angielski, ja jednak lubię mieć to, co się da po polsku. Zawsze można zmienić język, jak się czegoś szuka.

0

Tak przy okazji, czy ktoś wie, jak wywołać efekt "migania" się okna programu i ikony na pasku zadań na pomarańczowo? Znowu wiem, jak to zrobić w WinApi, a w C# nie :)

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