2011-11-14 20 views
14

C# içinde geliştirilen Word 2010 Addin'den KeyPress olayını nasıl yakalayabilirim?Word 2010 Addin'den (C#) geliştirilen "KeyPress" olayına nasıl erişilir?

Not: Eşya takma gibi "karmaşık" çözümler aramıyorum, ancak nesne modelinden bile güzel ve düzenli . NET için arıyorum.

Ben "ellerimde" sahip uygulama nesnesidir:

Microsoft.Office.Interop.Word.Application

Saygılarımızla

+0

autohotkey: http://stackoverflow.com/questions/31470984/capturing-keydown-event-of-ms-word – wideweide

cevap

17

Maalesef hiçbir şey yerleşik Word API veya tuş vuruşlarını alabilen VSTO, bu konuda daha fazla bilgi bulunabilir here

Bir süredir uygun bir çözüm arıyordum ama elimden gelenin en iyisi, bunları Windows API aracılığıyla ele almak oldu. , Bu yüzden burada aynı sonuca ulaşacak olasılığı yüksek bir örnek:

Aşağıdaki meclislere bir using direktifini eklemeniz gerekir:

public partial class ThisAddIn 
    { 
     private const int WH_KEYBOARD_LL = 13; 
     private const int WM_KEYDOWN = 0x0100; 

     private static IntPtr hookId = IntPtr.Zero; 
     private delegate IntPtr HookProcedure(int nCode, IntPtr wParam, IntPtr lParam); 
     private static HookProcedure procedure = HookCallback; 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr GetModuleHandle(string lpModuleName); 

     [DllImport("user32.dll", SetLastError = true)] 
     private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr SetWindowsHookEx(int idHook, HookProcedure lpfn, IntPtr hMod, uint dwThreadId); 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); 

     private void ThisAddIn_Startup(object sender, System.EventArgs e) 
     { 
      hookId = SetHook(procedure); 
     } 

     private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
     { 
      UnhookWindowsHookEx(hookId); 
     } 

     private static IntPtr SetHook(HookProcedure procedure) 
     { 
      using (Process process = Process.GetCurrentProcess()) 
      using (ProcessModule module = process.MainModule) 
       return SetWindowsHookEx(WH_KEYBOARD_LL, procedure, GetModuleHandle(module.ModuleName), 0); 
     } 

     private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
     { 
      if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
      { 
       int pointerCode = Marshal.ReadInt32(lParam); 
       string pressedKey = ((Keys)pointerCode).ToString(); 

       //Do some sort of processing on key press 
       var thread = new Thread(() => { MessageBox.Show(pressedKey); }); 
       thread.Start(); 
      } 
      return CallNextHookEx(hookId, nCode, wParam, lParam); 
     } 

     private void InternalStartup() 
     { 
      this.Startup += new System.EventHandler(ThisAddIn_Startup); 
      this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 
     } 
    } 
+0

İşlem kodu neden bir iş parçacığının içinde? Kendi testimde CallNextHookEx işleme işlenmemişse başarısız olur, ancak _why_ üzerinde herhangi bir belge bulamıyorum. –

+1

Yukarıdaki kod, MS Word'de karakter tipini yakalamıyor, kelimenin hemen dışında –

0
: Burada

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 
using System.Windows.Forms; 

Ve kanca

System.Windows.Forms WebBrowser yerine Excel WebBrowser Control kullanmayı deneyebilirsiniz; O

new Microsoft.Office.Tools.Excel.Controls.WebBrowser(); 

için

new System.Windows.Forms.WebBrowser(); 

WebBrowser contructor değiştirmek Sen başvuruları eklemek gerekir için bu vb TAB, DEL, CTRL + V,

gibi özel anahtar yönlendirme kolları senin proje: Proje/Başvuru Ekle/Uzantılar'ı seçin Microsoft.Tools.Outlook & Microsoft.Tools.Outlook.v4.0.Utilities

İlgili konular