2015-07-18 28 views
5

Czy istnieje sposób na wykrycie, kiedy użytkownik naciśnie klawisz w programie Microsoft Word przy użyciu języka VBA. Szukałem metody, która to robi. Szukałem również metod, które umożliwiają obejście tego problemu, na przykład wykrywanie, kiedy punkt wstawiania się porusza, lub wykrywa, kiedy nowy znak jest umieszczony w dokumencie tekstowym, ale ja nie patrzyłem. Obecnie używam appWord_WindowSelectionChange(ByVal Sel As Selection), ale to nie wykrywa podczas pisania.Wykrywanie, kiedy dane są dodawane do dokumentu, np. znak lub biała przestrzeń

Byłbym wdzięczny każdemu, kto pokazałby mi, jak wykryć naciśnięcie klawisza lub byłby w stanie pokazać mi obejście, które pozwoli osiągnąć ten sam cel.

Edit

przepraszam jeśli podsumowanie tego, co chcę powyżej, nie jest jasne. To, co mam, to sub, który uruchamia się przy użyciu appWord_WindowSelectionChange(ByVal Sel As Selection). Jednak to, czego chcę, to podpalenie, gdy jakiekolwiek dane są wprowadzane do dokumentu tekstowego, np. litera lub biała spacja. Na przykład, jeśli w stopce dokumentu słownego znajdowała się liczba znaków, a w tym dodatku, do którego mam aktualizacje, liczba znaków powinna zostać zaktualizowana, gdy użytkownik wpisze w dokumencie.

+0

Można użyć Windows API do wykrywania naciśnięć klawiszy: http://stackoverflow.com/questions/11153995/is-there-any-event-that-fires-when-keys-are-pressed -when-edycji-a-komórki –

+0

możesz również spróbować autohotkey: http: // stackoverflow.com/questions/31470984/capturing-keydown-event-of-ms-word – wideweide

Odpowiedz

2

Nie mój kod, ale HTH.

 Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer 
     Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer 

     Sub KeyStrokeLogger() 
      Dim i As Integer 
      Dim KeyAsciiValue As Integer 

      StartLogging 
      Do While True 
       For i = 1 To 255 
        If GetAsyncKeyState(i) = -32767 Then 
         If CapsLockIsOn() Then 
          If ShiftIsPressed() = True Then 
       KeyAsciiValue = Asc(LCase(Chr(i))) 
        Else 
       KeyAsciiValue = Asc(UCase(Chr(i))) 
        End If 
         Else 
          If ShiftIsPressed() = True Then 
       KeyAsciiValue = Asc(UCase(Chr(i))) 
        Else 
       KeyAsciiValue = Asc(LCase(Chr(i))) 
        End If 
         End If 
         LogKeyStroke KeyAsciiValue 
        End If 
       Next i 
       DoEvents 
      Loop 
     End Sub 

     Private Function CapsLockIsOn() As Boolean 
      CapsLockIsOn = CBool(GetKeyState(20)) 
     End Function 

     Private Function ShiftIsPressed() As Boolean 
      ShiftIsPressed = CBool(GetAsyncKeyState(16)) 
     End Function 

     Private Sub StartLogging() 
      Open "C:\keylog.txt" For Binary As #1 
      Seek #1, LOF(1) + 1 
     End Sub 

     Private Sub LogKeyStroke(KeyAsciiValue As Integer) 
      Dim c As String * 1 
      c = Chr(KeyAsciiValue) 
      Select Case KeyAsciiValue 
       Case 8 
        Put #1, , "{BACKSPACE}" 
       Case 9 
        Put #1, , "{TAB}" 
       Case 13 
        Put #1, , "{ENTER}" 
       Case 32 To 126 
        Put #1, , c 
       Case Else 
        Put #1, , "{" & KeyAsciiValue & "}" 
      End Select 
     End Sub 

* "Jak używać powyższy kod.

Krok 1 utworzyć nowy dokument w MS-Word

Step 2 przejdź do menu Narzędzia, Makro, Visual Basic Editor

Krok 3: Kliknij dwukrotnie ten obiekt dokumentu w obszarze Projekt (Dokument1) w oknie projektu

Krok 4: Skopiuj powyższy kod i wklej go do Edytora Visual Basic.

Krok 5 Zamknij Edytor Visual Basic i zapisz dokument.

Krok 6 Upewnij się, że makra są włączone. Aby rozpocząć rejestrowanie naciśnięć klawiszy w dowolnym momencie, kliknij Narzędzia, Makro, Makra. Wybierz KeyStrokeLogger i kliknij Uruchom. Wszystkie naciśnięcia klawiszy będą przechowywane w C: \ keylog.txt. „* LinkBack to Post

+0

To naprawdę sprytna sztuczka. Dziękuję – Dan

+0

Przy niewielkiej edycji dowiedziałem się, jak uruchomić makro po odebraniu naciśnięcia klawisza zamiast nagrać je do pliku '.txt'. Dziękuję bardzo – Dan

+0

Cieszę się, że to działa. Dziękuję za opinie. – ShaggyRogers

0

Użyj skrótów klawiaturowych, aby powiązać znaki z wybraną funkcją. Na przykład następujący kod (po uruchomieniu) uruchamia okno komunikatu, gdy użytkownik wprowadzi 0 w dokumencie tekstowym.

umieścić to w module 1

Sub AddKeyBinding() 
With Application 
    .CustomizationContext = ThisDocument 
    .KeyBindings.Add KeyCode:=BuildKeyCode(wdKey0), _ 
    KeyCategory:=wdKeyCategoryCommand, _ 
    Command:="userpressedzero" 
End With 
End Sub 

umieścić to w module 2

Sub userpressedzero() 
    Dim MyText As String 
    Selection.TypeText ("0") 
    MsgBox ("user pressed 0") 
End Sub 

Teraz uruchom moduł 1 i naciśnij 0 w dokumencie programu Word.

Powiązane problemy