cad.net 微信输入法闪退

闪退问题

微信输入法导致的闪退,害我调试了半天.
打开acad08,把微信输入法切换到中文拼音模式,一直按dddd....

影响一:
第一次按下d会在命令栏上面出现输入英文d,第二次按下就开始触发拼音了,
其实这个模式没有问题,好像是输入法没有优先捕获,直接放跑了第一个键入?

影响二:
有问题的是一旦焦点不在命令栏上面,
例如绘图区用鼠标选择空白位置一下,再输入ddddd....
就会把高频键入的不知道输入去哪里了,此时会触发闪退,vs调试上面报这个异常:

0x6FEC0318 (TextInputFramework.dll)处(位于 acad.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000001C 时发生访问冲突。

win10上面自带输入法不会,只会在命令栏上面频闪.
其他acad版本没有测试.
我怀疑是输入法焦点丢失,然后使得键入发生异常.

解决方案

1,微信输入法官方解决

TSF层:
可以通过  ITfThreadMgr  接口的  GetFocus()  和  SetFocus()  方法
来获取和设置TSF内部的文档焦点,而不是原始的窗口句柄,
它也可以订阅  ITfFocusChangeSink  事件来监听焦点变化,
但这本质上是“询问系统当前的客户是谁”,而不是自己去“侦查和判断焦点是否有效”.

传统IMM层:

// 0,白名单,根据进程名进行跳过焦点判断
string currentProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
if (!checkProcessSet.Contains(currentProcessName))
    return;

// 1,焦点窗口,是否存在且有效
// 文本栏,可输入的窗口
IntPtr hWndFocus = GetFocus();
if (hWndFocus == IntPtr.Zero || !IsWindow(hWndFocus))
    return;

// 2,前台窗口,是否属于当前活动的前台进程,
// 主进程窗口,在cad是容器,无法输入的.
IntPtr hWndForeground = GetForegroundWindow();
if (hWndForeground == IntPtr.Zero || !IsWindow(hWndForeground))
    return;

// 3,共同祖先
// a,前台窗口用来判断用户是否已切换程序,
// 在调试期间只弹出了cad主窗口,没有等命令栏窗口初始化完成就切换到其它进程窗口就会发生,
// 此时焦点窗口依然是cad,但是前台窗口已经切换到vs,不同步的.
// b,在对话框等子窗口,但与主程序状态不一致.
// c,僵尸句柄要预防性处理.
IntPtr hFocusRoot = GetAncestor(hWndFocus, GA_ROOT);
if ( hFocusRoot == IntPtr.Zero)
    return;
IntPtr hForeRoot = GetAncestor(hWndForeground, GA_ROOT);
if (hFocusRoot != hForeRoot)
    return;

// 4,检查输入上下文(对 TSF/IME 框架)
// 检查的是焦点窗口,输入上下文无效,可能已被 AutoCAD 释放
IntPtr hIMC = ImmGetContext(hWndFocus);
if (hIMC == IntPtr.Zero)
    return;

// 5,通过所有检查,安全发送输入
try
{
    // 例如:设置候选词、发送字符等
    ImmSetCompositionString(hIMC, ...);
    // 或通过 TSF 接口发送
}
finally
{
    if (hIMC != IntPtr.Zero)
        ImmReleaseContext(hWndFocus, hIMC);
}

2,利用cad二次开发解决

使用IFoxCad的输入法拦截,
原理是利用键盘钩子直接把按键字母发送到命令栏,
毕竟cad命令需要英文字母,这样就不会把中文输入到命令栏了.
IFoxCad拦截输入法

其它

其实我就是搜狗输入法卡vs2026,导致直接闪退vs就卸载了,换到微信输入法.
结果微信输入法会卡闪acad,症状轻微一点,甚至我能自救...
真就没有一个省心的,只能说缝缝补补又三年...
他们就不能用AI修复一下嘛,这点代码兼容层用不了啥时间吧...

posted @ 2026-03-04 22:26  惊惊  阅读(153)  评论(0)    收藏  举报