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

Odpowiedz Nowy wątek
2015-02-10 15:51
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!

"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" - keylogger jakiś? :) "mam spore doświadczenie w C++" - w takim razie wiesz, jak to zrobić :) - fourfour 2015-02-10 15:59

Pozostało 580 znaków

2015-02-10 15:57
0

Tutaj jest fajnie wytlumaczone: http://www.codeproject.com/Ar[...]Mouse-and-Keyboard-Hooks-in-C

Pozostało 580 znaków

2015-02-10 16:52
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.

edytowany 1x, ostatnio: MateuszW, 2015-02-10 16:54
Odinstaluj polski pakiet językowy do .NET'a bo nie można komunikatów błędów zrozumieć ;) - Xiuthechutli 2015-02-10 21:52

Pozostało 580 znaków

2015-02-10 21:56
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"

Pozostało 580 znaków

2015-02-11 00:21
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ę.

Pozostało 580 znaków

2015-02-11 08:55
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.

Pozostało 580 znaków

2015-02-11 13:46
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.

Pozostało 580 znaków

2015-02-11 13:55
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.

Pozostało 580 znaków

2015-02-11 15:14
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.

Pozostało 580 znaków

2015-02-13 00:07
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 :)

Pozostało 580 znaków

2015-02-13 09:12
0
        [DllImport("user32.dll")]
        static extern bool FlashWindow(IntPtr hwnd, bool bInvert);

W C#, ale korzystając z WinApi.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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