明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 857|回复: 8

[提问] lisp如何激活最大化Excel使其进去可编辑状态

[复制链接]
发表于 2018-3-31 15:52:02 来自手机 | 显示全部楼层 |阅读模式
一般采用vlax-get-object得到Excel程序的对象后,怎么才能使改Excel激活为当前活动程序呢?试了试activate方法好像不行
发表于 2018-3-31 19:55:44 | 显示全部楼层
本帖最后由 yxp 于 2018-3-31 19:57 编辑

(setq obj (vlax-get-or-create-object "Excel.Application"))
(vla-put-Visible obj 1)

第一步就已经将excel加入windows进程了,建议对单元格操作完毕再调用第二步,否则可能拖慢速度
 楼主| 发表于 2018-4-2 08:22:44 来自手机 | 显示全部楼层
将Excel程序可见性变成1,就能实现鼠标点击程序那样的效果吗?
发表于 2018-4-2 09:38:54 | 显示全部楼层
用Shell 中的sendkeys可以搞定
 楼主| 发表于 2018-4-2 10:09:48 来自手机 | 显示全部楼层
我想用lisp来控制Excel程序
发表于 2018-4-2 10:43:16 | 显示全部楼层
本帖最后由 yxp 于 2018-4-2 14:03 编辑
renhaitao_nice 发表于 2018-4-2 10:09
我想用lisp来控制Excel程序

以下是我的理解,不对之处请指出。
  • Lisp 控制 Excel 的本质,就是在 CAD 中装载一个 Excel 封装的 COM 自动化对象(Component Object Model 组件对象模型,简称 COM),然后用 Lisp 函数来操练 COM 的方法和属性,例如 vlax-invoke、vlax-put-property、vlax-get-property 函数。

  • 不仅仅是 Lisp 程序,任何语言程序都可以调用 COM,比如在一个网页浏览器中,可以用 JS 语言调用 COM;或者在 Excel 里用 vba 装载调用 CAD 的 COM 对象。微软为 COM 接口制订了规范标准,这就是 ActiveX 技术,ActiveX 是一种接口标准,比如 OLE 就是 ActiveX 之前的标准。

  • 我们经常使用的正则表达式 Regexp 对象;对文件操作的 FSO 对象;让 CAD 开口讲话的 SpVoice 对象;或者调用 RAR 对象来实现用 Lisp 压缩;这些都是 COM 框架下的自动化对象,相当于在计算机进程里加载了一个自动化引擎,你输入了 A 引擎就会自动计算输出 B 供你使用。只要你找到了对应的 ActiveX 接口(就是类的方法与属性),理论上你可以用 LISP 操作任何程序,包括在 CAD 中再调用一个 CAD 文档,号称是不打开 dwg 文件提取图元,实际上是在进程里后台打开了一个 CAD 对象,只不过没有在前台显示。

  • 对程序的最大化、最小化操作就看 COM 有没有提供这个接口函数,如果没有,那就是 Windows 层级的操作,需要用 Lisp 调用 Windows API 来控制。在 Lisp 查询接口用 (vlax-dump-object OBJ t) 函数,但是查询 Excel 接口时容易导致 CAD 奔溃,不明原因,估计是有点怕羞。CAD 中查询不到怎么办?很简单,直接上微软的官方网站查询它的对象模型,或者问度娘。

  • 正因为 ActiveX 可以被网页调用,用 IE 浏览器浏览网页时,恶意网站的 ActiveX 代码可以随意修改和控制你的电脑,甚至格式化硬盘。所以现在很多浏览器都不支持 ActiveX 了,或者需要手动打开开关,优秀的 COM 跨语言扩展性(跨32位和64位系统)也因为 ActiveX 的安全性而衰落,成也萧何败也萧何,背了个 IE 的黑锅。
 楼主| 发表于 2018-4-3 22:01:09 | 显示全部楼层
楼上的精彩论述我只能表示略懂一二,但目前我需要解决的是一个很实际的问题:
(defun c:ex()
        (setq exapp (vlax-get-or-create-object "excel.application"))
        (vlax-put exapp 'windowstate -4137)
  )
如上两行代码可以提取到打开的excel程序对象名,用windowstate属性确实可以操作excel窗口的大小,但是运行后,cad仍然在桌面最前面。如何将焦点移动到excel程序呢。就像用鼠标点击了excel程序一样。
发表于 2018-4-12 09:45:50 | 显示全部楼层
renhaitao_nice 发表于 2018-4-3 22:01
楼上的精彩论述我只能表示略懂一二,但目前我需要解决的是一个很实际的问题:
(defun c:ex()
        (setq exap ...

万能的办法就是调用 API 函数 SetWindowPos

示例见 http://bbs.mjtd.com/thread-177021-1-1.html
发表于 2018-4-12 09:50:13 | 显示全部楼层
appactive可以搞定
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-19 17:11 , Processed in 0.495700 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表