2011-11-14 11 views
14

मैं सी # 2010 में विकसित वर्ड 2010 एडिन से कीपप्रेस ईवेंट को "कैच" कैसे कर सकता हूं?वर्ड 2010 एडिन (सी # में विकसित) से "कीप्रेस" ईवेंट कैसे प्राप्त करें?

नोट: मैं हुकिंग सामान जैसे "जटिल" समाधान की तलाश नहीं कर रहा हूं, लेकिन ऑब्जेक्ट मॉडल से भी अच्छे और साफ .NET के लिए।

आवेदन वस्तु मैं "मेरे हाथ में" है:

Microsoft.Office.Interop.Word.Application

बेस्ट सादर

+0

ऑटोहोटीकी: http://stackoverflow.com/questions/31470984/capturing-keydown-event-of-ms-word – wideweide

उत्तर

17

दुर्भाग्य से वहाँ कुछ भी नहीं अंतर्निहित होता है पद एपीआई में या वीएसटीओ जो कुंजी स्ट्रोक उठा सकता है, इस पर अधिक जानकारी here

मैं कुछ समय के लिए एक व्यवहार्य समाधान खोज रहा हूं लेकिन सबसे अच्छा मैं इसे खोल सकता था विंडोज़ एपीआई के माध्यम से हुक का उपयोग कर , यह संभावना आप ऐसा यहां ही निष्कर्ष तक पहुंच जाएगा है एक उदाहरण है:

आप निम्न विधानसभाओं के लिए एक using निर्देश जोड़ने की आवश्यकता होगी:

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

प्रसंस्करण कोड थ्रेड के अंदर क्यों है? मेरे अपने परीक्षण में, प्रसंस्करण थ्रेड नहीं होने पर CallNextHookEx विफल होने लगता है, लेकिन मुझे _why_ पर कोई दस्तावेज़ नहीं मिल रहा है। –

+1

ऊपर कोड एमएस वर्ड में चरित्र प्रकार को फँस नहीं रहा है, यह सिर्फ शब्द के बाहर है –

0
: हुक है

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

और यहाँ

आप System.Windows.Forms WebBrowser के बजाय Excel WebBrowser Control का उपयोग करने का प्रयास कर सकते हैं; यह टैब, डेल, Ctrl + वी, आदि

के रूप में विशेष कुंजी अग्रेषण संभालती है कि

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

को

new System.Windows.Forms.WebBrowser(); 

से WebBrowser contructor बदल आप में संदर्भ जोड़ने की आवश्यकता होगी के लिए अपने प्रोजेक्ट: प्रोजेक्ट/संदर्भ/एक्सटेंशन जोड़ें Microsoft.Tools.Outlook & माइक्रोसॉफ्ट.Tools.Outlook.v4.0.Utilities

संबंधित मुद्दे