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修复一下嘛,这点代码兼容层用不了啥时间吧...
浙公网安备 33010602011771号