Я хочу получить текстовый ввод CoreTextServicesManager, но событие TextUpdating даже не запускается. В моем проекте UWP он работает нормально.
Вот как я создаю службу:
CoreTextServicesManager manager = CoreTextServicesManager.GetForCurrentView();
CoreTextEditContext EditContext = manager.CreateEditContext();
EditContext.InputPaneDisplayPolicy = CoreTextInputPaneDisplayPolicy.Manual;
EditContext.InputScope = CoreTextInputScope.Text;
EditContext.TextRequested += delegate { };
EditContext.SelectionRequested += delegate { };
EditContext.TextUpdating += EditContext_TextUpdating;
EditContext.FocusRemoved += EditContext_FocusRemoved;
EditContext.NotifyFocusEnter();
Вот мои события:
private void EditContext_TextUpdating(CoreTextEditContext sender,
CoreTextTextUpdatingEventArgs args)
{
Debug.WriteLine(args.Text);
}
private void EditContext_FocusRemoved(CoreTextEditContext sender, object args)
{
Debug.WriteLine("Lost focus");
}
Почему событие TextUpdating не запускается? Что я делаю неправильно?





Я не уверен, что вы уже видели это (поздний ответ после того, как я нашел этот вопрос в Google), но, к сожалению, поддержка некоторых API-интерфейсов UWP была прекращена. В этой статье предлагаются некоторые замены и обходные пути для некоторых из них. https://learn.microsoft.com/en-gb/windows/apps/desktop/modernize/desktop-to-uwp-supported-api
У нас это работает в нашем приложении UWP. Убедитесь, что вы находитесь в основной теме
imeInputPane = CoreInputView.GetForCurrentView();
imeInputPane.PrimaryViewShowing += ImeInputPane_PrimaryViewShowing;
imeInputPane.PrimaryViewHiding += ImeInputPane_PrimaryViewHiding;
imeTextContext = CoreTextServicesManager.GetForCurrentView().CreateEditContext();
// Manually control when soft keyboard shows. When hard keyboard is attached, the
// soft keyboard will never show.
imeTextContext.InputPaneDisplayPolicy = CoreTextInputPaneDisplayPolicy.Manual;
// the default keyboard is general purpose soft keyboard, has no affect with hard keyboard
imeTextContext.InputScope = CoreTextInputScope.Text;
imeTextContext.TextRequested += IMETextContext_TextRequested;
imeTextContext.SelectionRequested += IMETextContext_SelectionRequested;
imeTextContext.FocusRemoved += IMETextContext_FocusRemoved;
imeTextContext.TextUpdating += IMETextContext_TextUpdating;
imeTextContext.SelectionUpdating += IMETextContext_SelectionUpdating;
imeTextContext.FormatUpdating += IMETextContext_FormatUpdating;
imeTextContext.LayoutRequested += IMETextContext_LayoutRequested;
imeTextContext.CompositionStarted += IMETextContext_CompositionStarted;
imeTextContext.CompositionCompleted += IMETextContext_CompositionCompleted;
...
private void IMETextContext_TextUpdating(CoreTextEditContext sender, CoreTextTextUpdatingEventArgs args)
{
string origText = imeText;
CoreTextRange range = args.Range;
CoreTextRange newSelection = args.NewSelection;
//Modify the internal text store for the IME
imeText = imeText.Substring(0, range.StartCaretPosition)
+ args.Text
+ imeText.Substring(Math.Min(imeText.Length,
range.EndCaretPosition));
newSelection.EndCaretPosition = newSelection.StartCaretPosition;
Debug.WriteLine(string.Format("IME SendReplaceText Orig Text '{0}' New Text '{1}' StartCaret '{2}' EndCaret '{3}'", origText, imeText, imeSelection.StartCaretPosition, imeSelection.EndCaretPosition - imeSelection.StartCaretPosition));
// Do something with the text
SendReplaceText(args.Text // new text
, range.StartCaretPosition // start position
, range.EndCaretPosition - range.StartCaretPosition // length of former text that is being replaced
, args.Text.Length); // length of the modified text
imeSelection = newSelection;
args.Result = CoreTextTextUpdatingResult.Succeeded;
}
private void IMEBypassControl_OnShowKeyboard(object sender, IMEBypassShowKeyboardEventArgs e)
{
try
{
if (e.Visible)
{
Task.Run(async () =>
{
if (MiscUtils.AreWeOnMainUIThread)
{
try
{
LOG.LogV(string.Format("IME Show Keyboard '{0}' Start '{1}' Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
//Debug.WriteLine(string.Format("IME Show Keyboard '{0}' Start '{1}' Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
imeTextContext.InputScope = CoreTextInputScope.Text;
imeText = e.Text;
imeSelection.StartCaretPosition = e.CursorPosition;
imeSelection.EndCaretPosition = e.CursorPosition;
imeTextContext.NotifyTextChanged(imeSelection, e.Text.Length, imeSelection);
SetFocus();
}
catch (Exception ex)
{
LOG.LogE(ex);
}
}
else
{
await MiscUtils.CallOnMainViewUiThreadAsync(() =>
{
try
{
LOG.LogV(string.Format("IME Show Keyboard '{0}' Start '{1}' Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
//Debug.WriteLine(string.Format("IME Show Keyboard '{0}' Start '{1}' Total Size '{2}", e.Text, e.CursorPosition, e.FetchSize));
imeTextContext.InputScope = CoreTextInputScope.Text;
imeText = e.Text;
imeSelection.StartCaretPosition = e.CursorPosition;
imeSelection.EndCaretPosition = e.CursorPosition;
imeTextContext.NotifyTextChanged(imeSelection, e.Text.Length, imeSelection);
SetFocus();
}
catch (Exception ex)
{
LOG.LogE(ex);
}
});
}
}).GetAwaiter().GetResult();
}
else
{
RemoveFocus();
}
}
catch (Exception ex)
{
LOG.LogE(ex);
}
}
else
{
RemoveFocus();
}
}
private void SetFocus()
{
imeTextContext.NotifyFocusEnter();
}
public void RemoveFocus()
{
if (MiscUtils.AreWeOnMainUIThread)
{
imeTextContext.NotifyFocusLeave();
imeInputPane.TryHide();
}
else
{
Task.Run(async () =>
{
await MiscUtils.CallOnMainViewUiThreadAsync(() =>
{
imeTextContext.NotifyFocusLeave();
imeInputPane.TryHide();
});
}).GetAwaiter().GetResult();
}
}
Ну да, это я уже видел. Как написано в документации, CoreTextServicesManager в настоящее время поддерживается только в Insiderbuilds. Очень надеюсь на поддержку в следующем обновлении. Спасибо за ваш ответ. Я все равно отмечу это как ответ