本文记录搜狗输入法某个版本在向 WPF 应用程序输入的时候,让 WPF 应用程序进程退出的问题
我在自定义的文本库里面用了如下代码
[ComImport, Guid("aa80e801-2021-11d2-93e0-0060b067b86e"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ITfThreadMgr
{
void Activate(out int clientId);
void Deactivate();
void CreateDocumentMgr(out IntPtr docMgr);
void EnumDocumentMgrs(out IntPtr enumDocMgrs);
void GetFocus(out IntPtr docMgr);
void SetFocus(IntPtr docMgr);
void AssociateFocus(IntPtr hwnd, IntPtr newDocMgr, out IntPtr prevDocMgr);
void IsThreadFocus([MarshalAs(UnmanagedType.Bool)] out bool isFocus);
void GetFunctionProvider(ref Guid classId, out IntPtr funcProvider);
void EnumFunctionProviders(out IntPtr enumProviders);
void GetGlobalCompartment(out IntPtr compartmentMgr);
}
在调用 SetFocus 方法时,也许此时进程就会退出
_hwndSource = (HwndSource) PresentationSource.FromVisual(foo);
if (_hwndSource == null)
return;
//尽管文档说传递null是无效的,但这似乎有助于在与WPF共享的默认输入上下文中激活IME
var threadMgr = ImeNative.GetTextFrameworkThreadManager();
threadMgr?.SetFocus(IntPtr.Zero);
以上的 GetTextFrameworkThreadManager 方法逻辑如下
internal static ITfThreadMgr GetTextFrameworkThreadManager()
{
TF_CreateThreadMgr(out var textFrameworkThreadMgr);
return textFrameworkThreadMgr;
}
[DllImport("msctf.dll")]
internal static extern int TF_CreateThreadMgr(out ITfThreadMgr threadMgr);