Erkennen von Textänderungen in Word 2016 über das VSTO-Add-In
Diese Frage steht in engem Zusammenhang mitWie erhalte ich das "KeyPress" -Ereignis von einem Word 2010-Add-In (in C # entwickelt)? (und enthält tatsächlich den Beispielcode aus der Antwort auf diese Frage), hier geht es jedoch speziell um die Entwicklung in Visual Studio (Professional) 2015 für Word 2016 unter Windows 10.
Ich versuche zu erkennen, wann sich Text in einem Word-Dokument über ein VSTO-Add-In ändert. Ich verstehe von
Wie erhalte ich das "KeyPress" -Ereignis von einem Word 2010-Add-In (in C # entwickelt)? (14. November 2011)Erfassung des Keydown-Ereignisses von MS Word mit C # (21. Oktober 2012)Wie löse ich ein Ereignis auf MS Word aus? (24. Oktober 2012)Wie kann ich mit VSTO ein Tastendruckereignis in MSword abfangen? (5. November 2012)dass es keine ereignisgesteuerte Möglichkeit gibt, dies zu tun. Word sendet einfach keine Ereignisse, wenn sich der Text ändert.
Ich habe zwei Problemumgehungen erörtert:
Verwende das WindowSelectionChange Veranstaltung. Leider scheint dieses Ereignis gesendet zu werden, wenn die Auswahl durch Drücken der Pfeiltasten mit der Maus, Rückgängigmachen oder Wiederherstellen und wahrscheinlich durch andere Aktionen geändert wird, jedoch nicht beim Eingeben oder Löschen.Verwenden Sie einen Low-Level-Keydown-Ereignis-Hook. Dies wurde in mehreren dieser StackOverflow-Fragen erörtert und wurde in @ auch als „weit verbreitete Technik“ bezeichne ein Thread in einem Visual Studio-Forum im Februar 2014.Ich versuche, den Code in der Antwort auf @ zu verwendeWie erhalte ich das "KeyPress" -Ereignis von einem Word 2010-Add-In (in C # entwickelt)?, und es scheint, jedes Keydown-Ereignis zu beobachtenauße diejenigen, die an Word 2016 gesendet wurden.
Hier ist der Code, den ich verwende, um das Nachschlagen zu erleichtern.
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace KeydownWordAddIn
{
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 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(() => {
Debug.WriteLine(pressedKey);
});
thread.Start();
}
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
private void ThisAddIn_Startup(object sender, EventArgs e)
{
hookId = SetHook(procedure);
}
private void ThisAddIn_Shutdown(object sender, EventArgs e)
{
UnhookWindowsHookEx(hookId);
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
Wenn ich Word 2016 mit diesem Add-In ausführe, werden Tastendruckereignisse an den Edge-Browser und sogar an Visual Studio gesendet, jedoch nicht an Word selbst.
Werden in Word 2016 Keydown-Hooks irgendwie verhindert, oder mache ich etwas falsch?