我正在使用 Ruby 制作我的第一个应用程序。问题是我使用 shell.ShellExecute('outlook.exe',... 打开 Outlook对我来说:p!)
第二个问题。当我使用 shellExecute 打开应用程序时,是否可以在打开后将其最小化?
谢谢 !
我正在使用 Ruby 制作我的第一个应用程序。问题是我使用 shell.ShellExecute('outlook.exe',... 打开 Outlook对我来说:p!)
第二个问题。当我使用 shellExecute 打开应用程序时,是否可以在打开后将其最小化?
谢谢 !
要检查 Outlook 是否正在运行,首先安装 sys-proctable:
gem install sys-proctable
然后你可以这样做:
require 'sys/proctable'
puts Sys::ProcTable.ps.select{ |pe| pe.caption == "OUTLOOK.EXE" }.any?
如果存在名称为“OUTLOOK.EXE”的进程,则返回 true。这应该足够了。
一切都可以使用 Ruby 标准库来完成
win32ole
。
第二个问题。当我使用 shellExecute 打开应用程序时,是否可以在打开后将其最小化?
是的,这样做有一个选项(取自rubyonwindows
):
shell.ShellExecute(FILE, ARGUMENTS, DIRECTORY, OPERATION, SHOW)
现在看下面:
SHOW:建议最初应如何显示属于执行操作的应用程序的窗口(0 = 隐藏,1 = 正常,2 = 最小化,3 = 最大化)。应用程序可以忽略此建议。如果未指定此参数,则应用程序使用其默认值。
但我需要知道 Outlook 是否已经打开。
是的,可以选择这样做(取自Windows Management Instrumentation (WMI)
)
require 'win32ole'
shell = WIN32OLE.new('Shell.Application')
wmi = WIN32OLE.connect("winmgmts://")
processes = wmi.ExecQuery("select * from win32_process")
processes.each{|i| p "already opened" if i.name == "OUTLOOK.EXE"}
# => nil
shell.ShellExecute('OUTLOOK.EXE')
wmi = WIN32OLE.connect("winmgmts://")
processes = wmi.ExecQuery("select * from win32_process")
processes.each{|i| p "already opened" if i.name == "OUTLOOK.EXE"}
# => "already opened"