明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: yxp

[源码] LISP+DWX 之一:Windows API 调用示例

[复制链接]
发表于 2018-4-18 07:38 来自手机 | 显示全部楼层
这个用不用提前设置引用什么库呢
发表于 2018-4-18 14:37 | 显示全部楼层
请问 yxp 楼主:写完如何关闭记事本呢?
发表于 2018-5-11 21:45 | 显示全部楼层
准备学习下dwx的使用
下了“自动切换输入法”一贴5楼的附件
但是帮助文件打开是空白?
只好请教下楼主了

先说说我的需求再请教问题

1. 打开某个文件夹
(defun dirOpen ( target / shell result )
(if (and
   (or
    (eq 'INT (type target))
    (setq target (findfile target))
   )
   (setq shell (vla-getInterfaceObject *acad* "Shell.Application"))
  )
  (progn
   (setq result (vl-catch-all-apply 'vlax-invoke (list shell 'open target)))
   (vlax-release-object shell)
   (not (vl-catch-all-error-p result))
  )
)
)
这个函数在XP下好用
目标文件夹没打开时打开
已打开时置顶
但在win7里就只会“打开”这一个动作
搞得同一文件夹打开很多次
按楼主的说法
借助DWX可以做到像XP的运行效果

2. 不同窗口平铺
经常需要CAD窗口与其它某个窗口(比如word)平铺

要解决以上问题
我想的是首先要获取操作系统中已打开窗口的名称
再获取它的控制权
请教楼主
应该如何实现这个操作
以及接下来如何控制对象窗口的显示
如果方便的话
最好能给一个完整的范例学习一下
谢谢


点评

yxp
不同窗口平铺在 win10 里自带这个功能,把窗口向右拖动即可。  发表于 2018-5-12 14:11
发表于 2018-5-12 13:54 | 显示全部楼层
如何控制某个已打开窗体
已经摸到点边
首先通过窗体标题栏的文字内容
获取相应程序的句柄
再控制窗体的大小
这样我的需求就能实现了
但是还有几个问题需要请教一下


1. 目标窗体最小化
(setq jsb (get-fun-hand hCAD "*C:\\Windows\\System32"))
(vlax-invoke DWX 'SetWindowPos jsb -1 0 0 900 1000 64)
(vlax-invoke DWX 'SetWindowPos HCAD -1 900 0 1000 1000 64)
如上希望控制两个窗口平铺
如果运行程序以前文件夹没有最小化
程序运行是OK的
但如果是最小化的那么只有CAD改变了
想来第2句代码的写法还存在问题
或者在之前还需要其它的控制语句先解除最小化?

2. 目标窗体的置顶
凡是被程序控制过的窗体
就一直处于“置顶”的状态
打个比方
IE浏览器原本是最大化的
运行前段最后一句代码
CAD窗口占据了显示器的一半左右
然后鼠标点击IE
正常情况下IE会取代CAD成为顶层窗口
但是现在CAD依然“挡”在IE的前面
有没有其它参数可用
既能让窗体显示在最上层又不那么“强势”?

关于窗体的控制
有什么参考资料可以介绍下吗?

 楼主| 发表于 2018-5-12 14:14 | 显示全部楼层
本帖最后由 yxp 于 2018-5-12 14:17 编辑
masterlong 发表于 2018-5-12 13:54
如何控制某个已打开窗体
已经摸到点边
首先通过窗体标题栏的文字内容

参考一下

SetWindowPos
;;参数 2:
;;                1        将窗口置于窗口列表底部
;;                0        将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序
;;                -1        将窗口置于列表顶部,并位于任何最顶部窗口的前面(类似 QQ 界面)
;;                -2        将窗口置于列表顶部,并位于任何最顶部窗口的后面(正常)
;;参数 34: 窗口坐标 x y
;;参数 56: 窗口大小 w h
;;参数 7:
;                1 保持当前大小
;                2 保持当前位置
;                4 保持窗口在列表的当前位置
;                8 窗口不自动重画
;                16 不激活窗口
;                32 围绕窗口画一个框
;                64 显示窗口

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-5-12 15:11 | 显示全部楼层
谢谢
只是奇怪的很
下载的CHM打开又是空白的?
我自己其它的CHM打开都是正常的
CHM空白的问题我自己想办法

就是要实现自动窗口平铺啊
比如批打印PDF的时候
打印一张PDF
PDF浏览器会自动打开
关闭PDF的自动显示又不合适
自动平铺就方便对照检查了
现在功能已经实现
非常感谢


 楼主| 发表于 2018-5-12 19:22 | 显示全部楼层
masterlong 发表于 2018-5-12 15:11
谢谢
只是奇怪的很
下载的CHM打开又是空白的?

一、父子关系
每个窗口都可能有自己的父窗口和子窗口。但,系统中运行的窗口是有限的,说明总得
有个窗口是没有其父,我们把它叫做顶级窗口。一般把一个应用程序的主窗口就是顶级窗口,
VB 独立窗体及MDI 窗体都是顶级窗口。窗口间的父子关系一般遵循以下规则∶
1、父窗口显示时,所有包容在其中的可见的子窗口会随着父窗口的显示而显示出来。
2、父窗口隐藏时,所有包容在其中的子窗口会随着父窗口的隐藏而隐藏。
3、父窗口被卸载时,当然是∶跟着自动卸载。
4、父窗口移动时,跟着移动。

二、兄弟关系
当然,一位父亲有好几个儿女,都是常见的事情。同样,一个父窗口可以拥有多个子窗
体。比如,位于一个窗体中的各种控件之间以及MDI 窗口的各子窗口之间的关系。父窗口
与子窗口的显示、隐藏、卸载及移动,其先后顺序是显而易见的。那么各兄弟窗口之间的情
况会是如何呢?
显然,两个互相重叠的两个子窗体不能都同时显示出它的全貌,自然有个显示的顺序规
则。这个顺序规则叫做 Z 序列。有个解释为,如果把屏幕坐标看层X 和Y 轴组成的平面(事
实上正是如此),那么作为三维坐标系统 Z 轴可看做是垂直于屏幕的坐标轴。这样,可以认
为屏幕上的所有窗口是垂直于这个 Z 轴的。在 Z 轴上,谁在前,谁在后,就产生了一个Z
序列。很生动!可用WINDOWS API 函数对 Z 序列进行控制
发表于 2019-4-9 21:30 | 显示全部楼层
请教版主
批打印时每生成一个PDF以后
都会在PDF浏览器中打开
希望累计打印50张图纸以后
关闭PDF浏览器
避免内存占用过大

已用下面的语句获取了PDF浏览器的句柄
如何关闭就不知道怎么弄了

;;变量初始化
(setq *acad*   (vlax-get-acad-object)
         *doc*   (vla-get-ActiveDocument *acad*)
         hCAD    (vla-get-hwnd *acad*)                  ;;顶层 CAD 对象句柄
         hdwg    (vla-get-hwnd *doc*)                  ;;当前 dwg 对象句柄
         *dwx*   (vlax-get-or-create-object "DynamicWrapperX")  ;;创建一个 DWX 对象
)
;;Windows API 函数声明
(vlax-invoke *dwx* 'Register "shell32.dll" "ShellExecuteW" "i=hwwwwl" "r=m")
(vlax-invoke *dwx* 'Register "user32" "SetWindowTextW" "i=hw" "r=m")
(vlax-invoke *dwx* 'Register "user32" "GetKeyState" "i=n" "r=l")
(vlax-invoke *dwx* 'Register "user32" "keybd_event" "i=llll" "r=m")
(vlax-invoke *dwx* 'Register "user32" "SetWindowPos" "i=hmmmmmm" "r=m")
(vlax-invoke *dwx* 'Register "kernel32" "Beep" "i=mm" "r=m")
(vlax-invoke *dwx* 'Register "kernel32" "Sleep" "i=m")

(setq name "SD-51"   pdf_num 51)    ;;假定已打印50张
(setq jsb (get-fun-hand hCAD (strcat "*" name "*.pdf*")))   ;;获取PDF浏览器窗体的句柄

(if (> pdf_num 50)
(...)  ;;如何关闭PDF浏览器???
)

完全不懂VB
看帮助似乎要用到“CloseHandle”
但是下面的语句没能达到预期的目的
(vlax-invoke *dwx* 'Register "kernel32" "CloseHandle" "i=h")
(vlax-invoke *dwx* 'CloseHandle jsb)
发表于 2019-4-24 19:00 | 显示全部楼层
可不可以像dbx一样后台打开图纸进行操作呢??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-16 12:43 , Processed in 0.257267 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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