用ShellExecuteEx打开了一个文件,如何获取窗口句柄?

aa9egp01 2011-06-17 06:49:28
比如我用ShellExecuteEx打开一个mp3文件,这样就会自动调用关联程序播放此mp3,请问如何获取此关联程序的主窗口的句柄?
...全文
629 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
i21st 2013-07-09
  • 打赏
  • 举报
回复
楼主解决问题了么?解决请指教下,我也碰到这个问题了!
嗷嗷叫的老马 2011-06-18
  • 打赏
  • 举报
回复
ShellExecuteEx打开文件后的hProcess成员是一个进程句柄,等于使用OpenProcess后返回的句柄一样.

通过这个句柄得到PID,可以调用一个XP SP1新增的函数GetProcessId来完成.

声明:

Private Declare Function GetProcessId Lib "kernel32" (ByVal hProcess As Long) As Long

如果想更通用些,可以调用一个内核函数NtQueryInformationProcess来完成,GetProcessId其实就是对它的一个简单封装.

参考:

通过进程句柄(hProcess)获得PID

有了PID后,就可以使用EnumWindows+GetWindowThreadProcessId来进行你的下一步工作了.
aa9egp01 2011-06-17
  • 打赏
  • 举报
回复
看来这里的人气不太旺,我应该发到VC版块。
aa9egp01 2011-06-17
  • 打赏
  • 举报
回复
如果其他板块的哪位网友用过VB6,也请指点一下。
aa9egp01 2011-06-17
  • 打赏
  • 举报
回复
感谢网友们的回答,但我还是没有较好的解决方案。
「已注销」 2011-06-17
  • 打赏
  • 举报
回复
我不知道怎样通过HINSTANCE查找Process。FindWindow的2个参数一个是窗口类名,一个是标题文字,这2个都不知道填什么。调用ShellExecuteEx后可得到hProcess,用GetWindowThreadProcessId可得到某个窗口所属的进程的PID。但是枚举到某个窗口后只能知道PID,无法和ShellExecuteEx的hProcess进行比较,如果用那个PID调用了OpenProcess得到了hProcess,那个hProcess很可能和ShellExecuteEx得到的hProcess不一样,也无法比较。由于我要打开非可执行程序,所以不能用CreateProcess,所以麻烦各位出个主意。
threenewbee 2011-06-17
  • 打赏
  • 举报
回复
ShellExecute() 会返回 HINSTANCE,根据 HINSTANCE 去查找 Process

用 FindWindow 查找顶层窗口,再判断是否隶属于这个 Process,至于所谓主窗口还是子窗口,则属于逻辑上的问题,所以不好判断。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧