如何使用Ruby检测打开的应用程序

时间:2013-06-25 11:10:53

标签: ruby outlook shellexecute

我正在使用Ruby创建我的第一个应用程序。 问题是我使用shell.ShellExecute('outlook.exe',...打开outlook。 但是我需要知道outllok是否已经开放。 (每当我调用它时,脚本会生成一个outlook实例......这对我来说很糟糕:p!)

第二个问题。当我用shellExecute打开一个应用程序时,是否可以在打开后将其最小化?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

所有可以使用Ruby标准库 win32ole完成。


  

第二个问题。当我用shellExecute打开一个应用程序时,是否可以在打开后将其最小化?

是的,这样做有一个选项(取自rubyonwindows):

shell.ShellExecute(FILE, ARGUMENTS, DIRECTORY, OPERATION, SHOW)

现在看下面:

  

SHOW:建议最初如何显示属于执行操作的应用程序的窗口(0 =隐藏,1 =正常, 2 =最小化 ,3 =最大化)。应用程序可以忽略此建议。如果未指定此参数,则应用程序将使用其默认值。


  

但我需要知道展望是否已经开放。

是的,这样做有一个选项(取自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"

答案 1 :(得分:1)

要检查Outlook是否正在运行,请先安装sys-proctable:

gem install sys-proctable

然后你可以这样做:

require 'sys/proctable'

puts Sys::ProcTable.ps.select{ |pe| pe.caption == "OUTLOOK.EXE" }.any?

如果存在名为" OUTLOOK.EXE"的进程,则返回true。这应该足够了。