一开始使用 shell ,这样可以得到打开程序的 hwnd,在使用 WaitForSingleObject 就可以实现。可我想让系统使用默认程序任意文件,于是改用 ShellExecute ,可以这个 Api 不返回句柄。于是在用 EnumWindows 枚举出所有的程序来查找,可是在 ShellExecute 时打开的程序有可能很慢,这样往往在EnumWindows 时第一次找不到,还要在中间加上 Sleep(n)。假如说枚举的所有程序中有我想要的我又怎么知道是哪一个呢?
解决方案 »
- 为何窗体的[<]向前,[>]向后,[<<]最初,[>>]最后,这个Button,无论点击哪一个,页面始终显示第一条记录呢?
- 辞职信已经递了,回家放牛!
- 这个月已经第二次散光所有分了~~
- 请问哪里有关配色介绍方面的网站啊?简单说就是我想知道现在软件界面流行色的RGB值,哪有啊?
- 如何通过按向上向下方向键实现Updown控件两个单击事件
- SOS!紧急求助,版主帮我啊!
- 各位大佬帮帮忙
- 一个菜鸟的问题??
- 初学者如何编写网络版程序?使用什么来编程?是COM+还是WINSOCK?
- 急急 vb6.0生成 exe文件时,提示:对象名 “1表” 无效
- 请问调用Window的拨号上网的API是什么?
- 在线等~~~~~~~~怎样删除联合查询里面的纪录?
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (ShellInfo As SHELLEXECUTEINFO) As LongPrivate Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
' Optional fields
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Typedim sInfo as SHELLEXECUTEINFO
sInfo.hwnd 是指传入的父句柄吗?
即可
Option Explicit
Private Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (ShellInfo As SHELLEXECUTEINFO) As Long
Private Const SEE_MASK_FLAG_DDEWAIT = &H100
Private Const SEE_MASK_NOCLOSEPROCESS = &H40
Private Const SEE_MASK_FLAG_NO_UI = &H400
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
' Optional fields
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type
Private Function Fileopen(sPath As String) As Long
On Error Resume Next
Dim she As SHELLEXECUTEINFO
she.cbSize = 60
she.fMask = SEE_MASK_FLAG_DDEWAIT + SEE_MASK_NOCLOSEPROCESS + SEE_MASK_FLAG_NO_UI
she.hwnd = Me.hwnd
she.lpVerb = "open"
she.lpFile = sPath
she.lpParameters = vbNullString
she.lpDirectory = vbNullString
she.nShow = 1 '设为0则不可见
she.hInstApp = 0
she.lpIDList = 0
she.lpClass = vbNullString
she.hkeyClass = 0
she.dwHotKey = 0
she.hIcon = 0
she.hProcess = 0
Fileopen = ShellExecuteEx(she)
End FunctionPrivate Sub Command1_Click()
Dim x As Long
Dim sfile As String
sfile = "d:\mc\aa.bmp"
x = Fileopen(sfile)
End Sub
读注册表,得到默认的程序,用shell programpath & " " & filepath 即可---------------------
我用过这种方法,但是不是所有的程序都能调用 .exe " " filename 打开的,比如:
acdsee.exe(假设是 acdsee的执行文件) " " & c:\1.jpg,这样就不行。*********************
我先试试 rainstormmaster(rainstormmaster) 的方法:不过我想实现的是等待 ShellExecute 打开的程序结束后,源程序在继续执行。
之所以使用 ShellExecuteEx 是因为它的结构中有 she.hwnd,she.hProcess 值,我想知道在调用之前设置这些值或者在执行之后这些值被 Api 修改,以实现我找到被打开程序的目的。谢谢大家,请继续指教。
这样解决还是用shell语句
这样写:
Dim pid As Long
pid = Shell("start d:\mc\aa.bmp")
试试看,你发现了什么?
"Shell("start c:\odbcconf.log")"
“文件未找到!”,start 是个什么东西,start.exe?