lisp如何激活最大化Excel使其进去可编辑状态
一般采用vlax-get-object得到Excel程序的对象后,怎么才能使改Excel激活为当前活动程序呢?试了试activate方法好像不行 本帖最后由 yxp 于 2018-3-31 19:57 编辑(setq obj (vlax-get-or-create-object "Excel.Application"))
(vla-put-Visible obj 1)
第一步就已经将excel加入windows进程了,建议对单元格操作完毕再调用第二步,否则可能拖慢速度 将Excel程序可见性变成1,就能实现鼠标点击程序那样的效果吗? 用Shell 中的sendkeys可以搞定 我想用lisp来控制Excel程序 本帖最后由 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 的黑锅。
楼上的精彩论述我只能表示略懂一二,但目前我需要解决的是一个很实际的问题:
(defun c:ex()
(setq exapp (vlax-get-or-create-object "excel.application"))
(vlax-put exapp 'windowstate -4137)
)
如上两行代码可以提取到打开的excel程序对象名,用windowstate属性确实可以操作excel窗口的大小,但是运行后,cad仍然在桌面最前面。如何将焦点移动到excel程序呢。就像用鼠标点击了excel程序一样。 renhaitao_nice 发表于 2018-4-3 22:01
楼上的精彩论述我只能表示略懂一二,但目前我需要解决的是一个很实际的问题:
(defun c:ex()
(setq exap ...
万能的办法就是调用 API 函数 SetWindowPos
示例见 http://bbs.mjtd.com/thread-177021-1-1.html appactive可以搞定
页:
[1]