2015-07-18 8 views
5

kullanıcının VBA'yı kullanarak Microsoft Word bir tuşa bastığında algılamak için bir yolu var mı. Bunu yapan bir yöntemi aradım. Ben de böyle tespitinin bu bir yol oluşturmak yöntemler aramış ekleme noktası hareket ettiğinde veya yeni bir karakter word belgesi yerleştirilir, ama hiç göz vardı ne zaman algılar. Şu anda appWord_WindowSelectionChange(ByVal Sel As Selection) kullanıyorum, ancak yazarken bu algılamıyor.Verilerin bir belgeye eklendiği zaman saptanması, örn. Bir karakter veya boşluk

Bir tuşa basmayı nasıl algıladığımı gösteren veya bana aynı hedefi gerçekleştirecek bir geçici çözüm gösterebileceğimi gösteren herkese minnettar olurum.

Düzenleme

Yukarıda istediğini özeti açık değilse özür dilerim. Sahip olduğum şey, appWord_WindowSelectionChange(ByVal Sel As Selection) kullanarak yangın yapan bir alt. Bununla birlikte, istediğim şey, kelime belgesine herhangi bir veri girildiğinde, bu alt ateştir. bir harf veya beyaz boşluk karakteri. Bu karakterin saymak güncellemeleri var word belgesi alt bilgisinde bir karakter sayısı ve bu alt olsaydı Örneğin, karakter sayısı alanını belgede kullanıcı yazarken güncellemeniz gerekmektedir.

+0

Sen tuşa basma algılamak için Windows API kullanabilirsiniz: http://stackoverflow.com/questions/11153995/is-there-any-event-that-fires-when-keys-are-pressed -yeni-düzenleme-a-hücre- –

+0

da autohotkey'i deneyebilirsiniz: http: // stackoverflow.com/questions/31470984/yakalama-keydown-olayı-ms-word – wideweide

cevap

2

Benim Kod ama 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 

* "Yukarıdaki kodu nasıl kullanılır:.

Adım 1 MS-Word yeni bir belge oluşturun

Adım 2 Git Araçları ', Makro, Visual Basic Düzenleyicisi

Proje penceresinde

Adım Projesi (Document1) kapsamında ThisDocument Nesne üzerinde 3 çift tıklayın.

Adım 4 Kopya Yukarıdaki kod ve Visual Basic Editor yapıştırın.

Adım 5 Visual Basic Düzenleyicisi'ni kapatın ve belgeyi kaydedin.

Adım 6 Makroların etkin olduğundan emin olun. Tuş vuruşlarını herhangi bir zamanda kaydetmeye başlamak için Araçlar, Makro, Makrolar'a tıklayın. KeyStrokeLogger'ı seçin ve Çalıştır'ı tıklayın. Tüm tuş vuruşları C: \ keylog.txt dosyasında saklanır. "* LinkBack to Post

+0

Bu gerçekten akıllı bir hile. Teşekkür ederim – Dan

+0

Biraz düzenleme ile, bir '.txt' dosyasına kaydetmek yerine bir tuş vuruşu aldığında makroyu nasıl çalıştırılacağını öğrendim. Çok teşekkür ederim – Dan

+0

memnun var çalışma var. Geribildirim için teşekkür ederiz. – ShaggyRogers

0

Karakterleri istediğiniz işleve bağlamak için tuş bağlamalarını kullanın. Örneğin, aşağıdaki kod (çalıştırıldığında), kullanıcı sözcük belgesinde 0 girdiğinde bir mesaj kutusu tetikler.

Şimdi modülü 1 çalıştırmak ve kelime belgede 0 tuşuna

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

2. modülde modülü 1 koy

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

koy.

İlgili konular