如何使用 AutoLISP 检查应用程序是否 运行
How to check if application is running using AutoLISP
在 CAD 应用程序 (ZWCAD) 中,我通过 AutoLISP 启动我的应用程序。
(startapp "C://[path]//Application.exe")
因此每次创建新文件时应用程序都会运行。工作正常。
现在我想将应用程序实例限制为一个。
那么如何检查应用程序是否已经 运行?
您可以使用函数查询 Win32_Process WMI class 以查找名称与给定应用程序匹配的进程。
这样的函数可以这样写:
;; Win32 Process-p - Lee Mac
;; Returns T if a process exists with the supplied name
(defun LM:win32process-p ( pro / qry rtn srv wmi )
(if (setq wmi (vlax-create-object "wbemscripting.swbemlocator"))
(progn
(setq rtn
(vl-catch-all-apply
'(lambda ( )
(setq srv (vlax-invoke wmi 'connectserver)
qry (vlax-invoke srv 'execquery (strcat "select * from win32_process where name = '" pro "'"))
)
(< 0 (vla-get-count qry))
)
)
)
(foreach obj (list qry srv wmi)
(if (= 'vla-object (type obj)) (vlax-release-object obj))
)
(and (not (vl-catch-all-error-p rtn)) rtn)
)
)
)
可以通过以下方式调用:
_$ (LM:win32process-p "notepad.exe")
T
今天我找到了更简单的方法。准备使用 LISP 函数
(dos_processes)
returns 所有 运行 进程的列表。
在 CAD 应用程序 (ZWCAD) 中,我通过 AutoLISP 启动我的应用程序。
(startapp "C://[path]//Application.exe")
因此每次创建新文件时应用程序都会运行。工作正常。
现在我想将应用程序实例限制为一个。 那么如何检查应用程序是否已经 运行?
您可以使用函数查询 Win32_Process WMI class 以查找名称与给定应用程序匹配的进程。
这样的函数可以这样写:
;; Win32 Process-p - Lee Mac
;; Returns T if a process exists with the supplied name
(defun LM:win32process-p ( pro / qry rtn srv wmi )
(if (setq wmi (vlax-create-object "wbemscripting.swbemlocator"))
(progn
(setq rtn
(vl-catch-all-apply
'(lambda ( )
(setq srv (vlax-invoke wmi 'connectserver)
qry (vlax-invoke srv 'execquery (strcat "select * from win32_process where name = '" pro "'"))
)
(< 0 (vla-get-count qry))
)
)
)
(foreach obj (list qry srv wmi)
(if (= 'vla-object (type obj)) (vlax-release-object obj))
)
(and (not (vl-catch-all-error-p rtn)) rtn)
)
)
)
可以通过以下方式调用:
_$ (LM:win32process-p "notepad.exe")
T
今天我找到了更简单的方法。准备使用 LISP 函数
(dos_processes)
returns 所有 运行 进程的列表。