我正在使用os.execute()
来调用Lua中的其他程序,当程序运行时,cmd窗口会弹出一个闪烁,我调用执行超过一百次,它变得很烦人。
那么有没有办法让窗口看不见?
答案 0 :(得分:7)
我个人不满意“不,你不能”的答案,并且只是“解决问题”的工程师类型,我能够使用WScript.Shell获得工作:
Shell = luacom.CreateObject("WScript.Shell")
Shell:Run (command, 0)
“0”用于抑制弹出窗口的发生。 http://msdn.microsoft.com/en-us/library/d5fk67ky%28v=vs.84%29.aspx
答案 1 :(得分:3)
hjpotter在评论中给出了简短的答案: 不,你不能 。
接下来是一个更长的解释。
在Windows上,可执行文件有“两种风格”: GUI应用程序和命令行应用程序。这与程序的内部工作无关,但它取决于程序的构建方式(在PE可执行文件头中有一个标志,可以使用链接器选项设置)。在执行命令行应用程序时,操作系统会自动弹出控制台窗口(“丑陋的黑盒子”)。
os.execute
的问题在于uses C system
function under the hood,而这可能是通过执行Windows命令shell可执行文件cmd.exe
来实现的,其中是命令线申请。因此,每次使用os.execute
时,您确实在执行cmd.exe
。该黑框是与正在执行cmd.exe
相关联的控制台窗口。
答案 2 :(得分:2)
我想到了使用外星人库的其他解决方案。
Alien是一个以纪律严明的方式使用lua访问windows dll的库。为了在不打开shell窗口的情况下执行命令文件,可以使用ShellExecuteA
中的函数Shell32.dll
:可以找到其文档here,并通过以下代码段描述合适的方法
require 'alien'
local shell32 = alien.load('Shell32.dll')
shell32.ShellExecuteA:types("pointer","pointer","pointer","pointer","pointer","pointer","int")
local exec = shell32.ShellExecuteA
function osexec(cmd, open)
if open then
-- execute opening a window
exec(0,"open","cmd.exe","/C "..cmd,0,3)
else
-- execute, no window opened
exec(0,"open","cmd.exe","/C "..cmd,0,0)
end
end
仅使用该命令调用上一个函数,在不打开窗口的情况下运行它,使用两个操作数osexec ("dir", true)
调用会打开一个窗口,对于调试非常有用。