C#创建的自定义窗口和面板在加载到CAD进行显示时,会自动获取句柄,有时候需要返回CAD界面进行操作(如选择对象)时,鼠标离开自定义窗口或者面板后,CAD无法获得句柄,需要点选一下CAD操作空间后,才能开始交互操作,给程序运行带来诸多不便:

为了解决该问题,需要利用Windows API函数SetFocus实现,具体步骤为:
在类开头添加api函数申明
[DllImport("user32.dll", EntryPoint = "SetFocus")]
public static extern int SetFocus(IntPtr hWnd);
同时,在窗体或面板类的MouseLeave事件中调运SetFocus函数
private void PaletteDict_MouseLeave(object sender, EventArgs e)
{
SetFocus(Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Window.Handle);
}
但是,测试发现该方式在鼠标快速移动时,焦点切换明显滞后,为此,本人亲测发现,可以在具体的交互操作中继续添加SetFocus函数的调用:
Document doc = acadApp.DocumentManager.MdiActiveDocument;
DocumentLock docLock = doc.LockDocument();
Database db = doc.Database;
Editor ed = doc.Editor;
SetFocus(doc.Window.Handle);//提前调用
PromptEntityResult per = ed.GetEntity("\n请选择对象");
using (Transaction tran=db.TransactionManager.StartTransaction()
{
...
}
可有效解决焦点切换滞后的问题!

本文介绍如何使用C#创建的自定义窗口在CAD环境中无缝切换焦点,通过调用SetFocus函数解决鼠标离开窗口后CAD界面响应延迟的问题,确保了交互操作的流畅性。
&spm=1001.2101.3001.5002&articleId=102904481&d=1&t=3&u=ca18e34ffd3e40af8977e7610024729a)
3386

被折叠的 条评论
为什么被折叠?



