qflut 发表于 2007-8-15 14:35:00

VB与CAD焦点切换的困扰!

<p>VB写的程序,用AppActivate (acadapp.Caption)可以使CAD获得焦点,这时候我选择实体以后需要将焦点返回到VB窗体。可是我怎么弄,都是VB窗体闪烁三下就失去焦点!(我用了SetWindowPos使VB窗体提到最前面)。用了form1.textbox1.setfocus、appactivate(me.caption)、form1.show都不行。输入的内容老是输入到CAD命令行了,请指教!</p>

英雄无敌 发表于 2007-8-15 15:13:00

你试试setforegroundwindow这个API函数

qflut 发表于 2007-8-15 19:57:00

<p>郁闷的是我用上面列的方法曾经实现过,但是被我一不小心不知道怎么弄了就又不行了。老是闪烁三下就失去焦点</p>

qflut 发表于 2007-8-15 22:26:00

在网上搜索了一下,好像说只能从VB中把焦点转移给CAD,而CAD不能把焦点转移给VB程序。但是我明明就实现过,太郁闷了!

zhang007 发表于 2007-8-15 22:35:00

<p>做成DLL就不存在焦点问题了</p>

英雄无敌 发表于 2007-8-16 08:29:00

你可能需要在setforegroundwindow后再用一句doevents,或者sleep 10,试试吧,或者像楼上说的那样,做成DLL,不过,你在将焦点移到CAD前,先将VB的FORM HIDE,在要返回VB时,再用ME.show,也许没有这个问题

英雄无敌 发表于 2007-8-16 08:42:00

而且,你也没有必要用Setwindowpos来使程序总在最上面,你可以将你的VB程序的窗口做为CAD的子窗口,我刚刚试了一下,在到CAD前先ME.hide,再处理完CAD的事情后再ME.show,焦点转到了VB的窗口上。

qflut 发表于 2007-8-16 13:01:00

<p>谢谢英雄无敌!用me.hide&amp;me.show行不通,我试过,VB窗体获得焦点以后只是在任务栏里闪烁三下,键盘输入仍然在CAD的command栏里。我需要选择的时候CAD激活,选择完后输入的内容进入VB窗体的textbox1中,但是用APPactivate激活CAD容易,但从CAD返回VB窗体怎么弄都只是该窗体闪烁三次后失去焦点。也不知道是不是我自己设置的问题。</p><p>Private Sub Form_Load()<br/>&nbsp;&nbsp;&nbsp; On Error Resume Next<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; 'Dim myval As Long<br/>&nbsp;&nbsp;&nbsp; 'myval = SetWindowPos(Form1.hwnd, -1, 0, 0, 0, 0, 3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; Set acadapp = GetObject(, "AutoCAD.Application")&nbsp;</p><p>&nbsp;&nbsp;&nbsp; acadapp.Visible = True<br/>&nbsp;&nbsp;&nbsp; Set acaddoc = acadapp.ActiveDocument&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp; Set acadms = acaddoc.ModelSpace&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp; Dim objsset As AcadSelectionSet<br/>&nbsp;&nbsp;&nbsp; Set objsset = acaddoc.SelectionSets.Item("beam")<br/>&nbsp;&nbsp;&nbsp; objsset.Delete<br/>&nbsp;&nbsp;&nbsp; 'If Err Then<br/>&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp; Err.Clear<br/>&nbsp;&nbsp;&nbsp; Set objsset = acaddoc.SelectionSets.Add("beam")<br/>&nbsp;&nbsp;&nbsp; 'End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp; Dim filtertype(7) As Integer<br/>&nbsp;&nbsp;&nbsp; Dim filterdata(7) As Variant<br/>&nbsp;&nbsp;&nbsp; filtertype(0) = -4<br/>&nbsp;&nbsp;&nbsp; filterdata(0) = "&lt;or"<br/>&nbsp;&nbsp;&nbsp; filtertype(1) = 8 '图层名<br/>&nbsp;&nbsp;&nbsp; filterdata(1) = "!水平标注"<br/>&nbsp;&nbsp;&nbsp; filtertype(2) = 8 '图层名<br/>&nbsp;&nbsp;&nbsp; filterdata(2) = "!垂直标注"<br/>&nbsp;&nbsp;&nbsp; filtertype(3) = -4<br/>&nbsp;&nbsp;&nbsp; filterdata(3) = "or&gt;"<br/>&nbsp;&nbsp;&nbsp; filtertype(4) = -4<br/>&nbsp;&nbsp;&nbsp; filterdata(4) = "&lt;or"<br/>&nbsp;&nbsp;&nbsp; filtertype(5) = 0 '对象类型<br/>&nbsp;&nbsp;&nbsp; filterdata(5) = "Text"<br/>&nbsp;&nbsp;&nbsp; filtertype(6) = 0 '对象类型<br/>&nbsp;&nbsp;&nbsp; filterdata(6) = "MText"<br/>&nbsp;&nbsp;&nbsp; filtertype(7) = -4<br/>&nbsp;&nbsp;&nbsp; filterdata(7) = "or&gt;"<br/>&nbsp;&nbsp;&nbsp; Me.Hide&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp; objsset.SelectOnScreen filtertype, filterdata<br/><br/>&nbsp;&nbsp;&nbsp; Me.Show</p><p>End Sub</p><p></p>

英雄无敌 发表于 2007-8-16 15:48:00

<p>你是在什么系统下啊,我按你的程序试了,焦点是在VB的窗口上的,我是cad2004+XP</p>

qflut 发表于 2007-8-16 23:09:00

XP_SP2+CAD2004和2006均是如此,窗体显示以后只是在任务栏闪烁
页: [1] 2
查看完整版本: VB与CAD焦点切换的困扰!