VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 1332|回复: 8

[求助] 用指定的ShellExecute打开某程序,如何获得句柄?

[复制链接]
发表于 2018-1-13 18:13:14 | 显示全部楼层 |阅读模式
  1. 'API声明:
  2. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
  3.     (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
  4.     ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

  5. '比如用打开QQ举例:
  6. SUB 用指定的ShellExecute打开文件()
  7. dim I&
  8. I = ShellExecute(Me.hwnd, "open", "tencent://message/?uin=12345678", vbNullString, vbNullString, 1)
  9. '上面的12345678是QQ号码
  10. end sub
复制代码

上面得到的 I,不是句柄。请问用ShellExecute 如何得到句柄?
发表于 2018-1-16 14:57:55 | 显示全部楼层
api CreateProcess

评分

参与人数 1威望 +2 人气 +1 收起 理由
bruly + 2 + 1 很给力

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-15 22:54:04 | 显示全部楼层
句柄有很多种啊 你是要问进程句柄还是窗口句柄

评分

参与人数 1威望 +2 收起 理由
bruly + 2 感谢提醒和关注

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-14 23:10:47 | 显示全部楼层
首先,你要知道ShellEx语句没有句柄就无法正常执行。
所以函数形参列表中的Me.hwnd就是句柄。
其他的没有了。至于你说的I不是句柄,如何获取句柄。
我只能说语句没有句柄。

评分

参与人数 1威望 +4 人气 +1 收起 理由
bruly + 4 + 1 很给力

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-1-14 23:26:38 | 显示全部楼层
此生无憾 发表于 2018-1-14 23:10
首先,你要知道ShellEx语句没有句柄就无法正常执行。
所以函数形参列表中的Me.hwnd就是句柄。
其他的没有 ...

续上例子,I >32表示成功,否则表示出错。
我用VB来打开QQ,要获得QQ的句柄,无法用me.hwnd来表示QQ句柄,故有此一问。
我想到了一个思路不知道行不行:通过 “qq.exe” 来找到QQ的安装路径,再用shell ?等能够猎取句柄 的语句来运行QQ.exe。但VB在查找qq.exe的方法 比较费时,所以没有采用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-16 05:48:21 | 显示全部楼层
JuncoJet 发表于 2018-1-15 22:54
句柄有很多种啊 你是要问进程句柄还是窗口句柄

窗口句柄,

点评

窗口会弹出来的话 就GetForegroundWindow,获取顶层窗口句柄就行了  发表于 2018-1-16 11:28
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-17 19:16:59 | 显示全部楼层

嗯,我去找一些实例看看,感谢老师关注~!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-19 06:50:12 | 显示全部楼层
本帖最后由 bruly 于 2018-1-19 06:51 编辑
JuncoJet 发表于 2018-1-15 22:54
句柄有很多种啊 你是要问进程句柄还是窗口句柄


您说的用GetForegroundWindow来获取顶层窗口的句柄,我在timer事件中发现显示为空:
   MessageBoxTimeout 0, GetForegroundWindow, "提示:", 0 + 4096, 0, 3000
      我的操作方法是:设置唯一的主窗体为隐藏形式,然后运行程序;timer.interval=100;
然后我在已打开的:浏览器、word、QQ、文本文件等窗体中 轮番切换,即这么最上面的是浏览器,一会又是QQ,一会是word……
          但不管如何,上面的MessageBoxTimeout显示都为空,不知道错在哪儿了。
附上API声明:
  1. Public Declare Function MessageBoxTimeout Lib "user32" Alias "MessageBoxTimeoutA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long, ByVal wlange As Long, ByVal dwTimeout As Long) As Long
  2. Public Declare Function GetForegroundWindow Lib "user32" () As Long            
  3. Private Sub Timer1_Timer()
  4. MessageBoxTimeout 0, GetForegroundWindow, "提示:", 0 + 4096, 0, 3000
  5. end sub
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2018-8-15 08:51

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表