2011-11-14 28 views
14

Làm cách nào để "bắt" sự kiện KeyPress từ một Word 2010 Addin được phát triển trong C#?Làm thế nào để có được sự kiện "KeyPress" từ một Word 2010 Addin (được phát triển trong C#)?

Lưu ý: Tôi không tìm kiếm các giải pháp "phức tạp" như các công cụ hooking, nhưng đối với các đẹp và gọn gàng .NET ngay cả từ mô hình đối tượng.

Đối tượng áp dụng Tôi có "trong tay tôi" là:

Microsoft.Office.Interop.Word.Application

Trân trọng

+0

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

Trả lời

17

Thật không may có được không có gì tích hợp sẵn trong Lời API hoặc VSTO có thể lấy nét chính, thông tin thêm về điều này có thể được tìm thấy here

Tôi đã tìm kiếm một giải pháp khả thi trong một thời gian nhưng tốt nhất tôi có thể đưa ra là xử lý nó thông qua Windows API bằng cách sử dụng móc , Nó có khả năng bạn sẽ đạt được kết luận tương tự vì vậy đây là một ví dụ:

Bạn sẽ cần phải thêm một chỉ thị using đến các hội đồng sau:

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

Và đây là cái móc:

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

Tại sao là mã xử lý bên trong của một sợi? Trong thử nghiệm của riêng tôi, CallNextHookEx có vẻ thất bại nếu quá trình xử lý KHÔNG được tạo luồng, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào trên _why_. –

+1

Mã trên không phải là kiểu bẫy trong MS Word, nó nằm ngoài từ –

0

Bạn có thể thử sử dụng Excel WebBrowser Control thay vì System.Windows.Forms WebBrowser; nó xử lý đặc biệt chuyển tiếp quan trọng như TAB, DEL, Ctrl + V vv

Cho rằng thay đổi contructor WebBrowser từ

new System.Windows.Forms.WebBrowser(); 

để

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

Bạn sẽ cần phải thêm tham chiếu đến của bạn project: Project/Add Reference/Extensions chọn Microsoft.Tools.Outlook & Microsoft.Tools.Outlook.v4.0.Utilities

Các vấn đề liên quan