2010-01-14 17 views
8

znalazłem ten kod hak klawiatura, która próbuję nieco zmodyfikować do moich celów: http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspxCzy mogę zmienić wejście klawiatury użytkownika?

jako przegląd, chcę mieć użytkownik naciśnie klawisz, powiedzieć „E” i mają zwrot klawiatury inną postać, "Z", do dowolnej aplikacji.

Odpowiednia metoda Zmieniłem teraz wygląda:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      //The truely typed character: 
      int vkCode = Marshal.ReadInt32(lParam); 
      Console.WriteLine((Keys)vkCode); 

      KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); 
      replacementKey.vkCode = 90; // char 'Z' 
      Marshal.StructureToPtr(replacementKey, lParam, false); 

      //Now changed to my set character 
      vkCode = Marshal.ReadInt32(lParam); 
      Console.WriteLine((Keys)vkCode); 
     } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

Konsola poprawnie wyświetla to jako:

E 
Z 
T 
Z 
G 
Z 
etc. 

Jednakże „E” in ostrości aplikacji nadal Typy stron zamiast „Z” . Czemu? Zmieniłem wejście haczykowatej klawiatury tak, by zawierało "Z" zamiast "E", a linie konsoli pokazują, że została ona zmieniona poprawnie!

Jak rozumiem, wywołanie return CallNextHookEx(_hookID, nCode, wParam, lParam); powoduje wysłanie polecenia "wydrukuj teraz" do otwartej aplikacji. Czy to nie działa? Czy jest coś, co uniemożliwia mi wpisywanie postaci, którą chcę? Wiem, że aplikacje takie jak AutoHotkey pobierają klucz wejściowy, sprawdzają go i zwracają inny znak. Jak mam zrobić to samo tutaj?

Dzięki!

+3

z ciekawości, jaka jest tego aplikacja? –

+1

To nie jest keylogger! :) Aplikacja jest technologią wspomagającą.Pomyśl o klawiaturze telefonu iPhone; za kulisami modyfikuje kluczowy obszar, koryguje oczywiste błędy i uruchamia inny inteligentny kod, aby pomóc Ci szybciej i dokładniej pisać. Jest to podobna aplikacja, ale dla pełnych klawiatur. – cksubs

Odpowiedz

5

Zrobiłem to wcześniej, ale trochę inaczej.
Zamiast próbować zmienić parametry wysłane do CallNextHookEx, "połknąłem" klawiszowe naciśnięcie (możesz to zrobić, zwracając niezerową wartość z procedury haka, aby zapobiec wywołaniu kolejnych procedur).

Następnie użyłem SendInput, aby wysłać nowy klucz, który chciałem "wstrzyknąć".

Więc w zasadzie to działa tak:

  • procedura haka identyfikuje klucz docelowy jest wciśnięty
  • połączenia do SendInput, z nowym kluczem
  • Return 1 z procedury haka do ignorowanych oryginalny klucz

Uważaj przekierowań cyklicznych, czyli 'a' przekierowany do 'b', które zostało przekształcone na 'a', można go łatwo wysadzić;)

+0

Cool, z powodzeniem zignorowałem oryginalny klucz zwracając '(IntPtr) 1;' Teraz, jak mam "SendInput'? Czy istnieje specyficzne 'using XXX', które muszę dołączyć do nagłówka, lub inny kod, który muszę dodać, aby użyć polecenia? – cksubs

+0

pinvoke.net ma cały kod wymagany do wywołania 'SendInput' - http://www.pinvoke.net/default.aspx/user32/SendInput.html –

+0

Ok, mam to za pomocą' [DllImport ("coredll.dll", SetLastError = true)] static extern uint SendInput (uint cInputs,/* [MarshalAs (UnmanagedType.LPArray)] */KEYBOARDINPUT [] input, int cbSize); 'i struktura KEYBOARDINPUT. Teraz pracuję nad przekazywaniem SendInput() odpowiednich parametrów. – cksubs

0

Najprawdopodobniej zainstalowałeś hak "szeroki gwint", a nie "system szeroki", co oznacza, że ​​tłumaczenie klucza wystąpi tylko dla wątku instalującego hak.

Aby zainstalować "system szeroki" będziesz potrzebować dwóch elementów: jednej biblioteki dll z "hakiem dostawcą" i exe zarządzającym nim. Oto dobry tutorial http://www.codeproject.com/KB/system/hooksys.aspx a tu przykład: http://www.codeguru.com/cpp/com-tech/shell/article.php/c4509/

Ale: 1. Instalowanie systemu szerokości haki mogą poważnie zepsuć ci systemu (upewnij się, że przekazania kluczy, aby nie tłumaczyć) . 2. Proszę ... nie twórz kolejnego keyloggera

+2

Używa niskiego poziomu haka klawiatury, a nie zwykłego haka klawiatury. Haczyk niskiego poziomu nie potrzebuje osobnej biblioteki dll, która zostanie załadowana do każdego procesu. Z http://msdn.microsoft.com/en-us/library/ms644985.aspx - jednak hak WH_KEYBOARD_LL nie jest wstrzykiwany do innego procesu. Zamiast tego kontekst przełącza się z powrotem do procesu, który zainstalował hook i jest wywoływany w jego oryginalnym kontekście. Następnie kontekst przełącza się z powrotem do aplikacji, która wygenerowała zdarzenie. –

+0

Więc ... czy to znaczy, że używam tego poprawnie? :) – cksubs

+0

Wiele informacji na temat implementacji/używania WH_KEYBOARD_LL (i wiele dyskusji na temat problemów dotyczących wykrywania modyfikatorów kontroli, przekazywania kluczowych informacji do następnej aplikacji lub blokowania itp. W komentarzach) CodeProject: http: // www. codeproject.com/KB/system/CSLLKeyboard.aspx "Low-level Windows API przechwytuje C#, aby zatrzymać niepożądane naciśnięcia klawiszy" Emma Burrows. Artykuł z 2007 r. – BillW

Powiązane problemy