void CreateContext() { ClearContext(); // clear old context if necessary if (!textArea.Options.EnableImeSupport) { return; } hwndSource = (HwndSource)PresentationSource.FromVisual(this.textArea); if (hwndSource != null) { //currentContext = ImeNativeWrapper.ImmCreateContext(); //previousContext = ImeNativeWrapper.AssociateContext(hwndSource, currentContext); currentContext = ImeNativeWrapper.GetContext(hwndSource); hwndSource.AddHook(WndProc); // UpdateCompositionWindow() will be called by the caret becoming visible var threadMgr = ImeNativeWrapper.GetTextFrameworkThreadManager(); if (threadMgr != null) { // Even though the docu says passing null is invalid, this seems to help // activating the IME on the default input context that is shared with WPF threadMgr.SetFocus(IntPtr.Zero); } } }
public void OnLostFocus(KeyboardFocusChangedEventArgs e) { if (e.OldFocus == textArea && currentContext != IntPtr.Zero) { ImeNativeWrapper.NotifyIme(currentContext); } ClearContext(); }
public void UpdateCompositionWindow() { if (currentContext != IntPtr.Zero) { ImeNativeWrapper.SetCompositionFont(hwndSource, currentContext, textArea); ImeNativeWrapper.SetCompositionWindow(hwndSource, currentContext, textArea); } }
void ClearContext() { if (hwndSource != null) { //ImeNativeWrapper.AssociateContext(hwndSource, previousContext); //ImeNativeWrapper.ImmDestroyContext(currentContext); ImeNativeWrapper.ReleaseContext(hwndSource, currentContext); currentContext = IntPtr.Zero; hwndSource.RemoveHook(WndProc); hwndSource = null; } }