VB怎样区分同名窗口?

来源:百度知道 编辑:UC知道 时间:2024/09/18 07:39:37
我是新手,也许那个东西不叫窗口标题名(因为我提过好多次相同的这个问题,回答的人都理解错误),那我打个比方.你现在看你所在的这个窗口的最左上面,是不是有几个字:百度知道.......-Windows Internet Explorer.
就是这个.

我的意思是:
A文件夹的窗口标题名为:A
A程序的窗口的标题名为:A

我打开两次A程序,再打开一次A文件夹,这三个窗口的窗口标题名都一样为A.

我想做个VB小程序,来区分这三个窗口.
因为刚刚接触VB,所以不太清楚那些高级的查找窗口方法,只知道查找窗口标题名来判定某个程序打开了.

窗体在 系统中,除了 标题栏外,还有一个区分的方法:类
操作系统中,窗体与窗体之间不可能重复的属性有很多。
比如句柄,每个窗体都拥有唯一的一个句柄,貌似我们建数据库的时候喜欢弄个id字段一样,不过句柄是每次运行的时候,系统生成的,程序每次运行的时候,句柄都不一样,我们虽然可以用句柄来区分窗体,但是下次这个程序运行的时候,句柄又变了,所以,句柄只适合操作系统区分窗体用的,不过我们可以用句柄来告诉系统,我们要操作那个窗体。。。
线程,进程,我们知道windows最大的优点就是多线程可以同时运行。那么线程id,进程id又成了窗体间的不可重复的唯一属性,这个属性跟句柄大同小异。
类,关键的就是这个了,句柄,线程id,进程id,都是系统在每次运行的时候自动生成的,所以我们写程序的时候,不知道系统给目标程序分配的句柄,线程id,进程id是多少,但是类名大部分程序是不会变的,而且类名也是唯一的~~~
所以区分窗体的方法就是用类名来区分~~~

判定某个程序是否已打开,不能简单用查找窗口标题名的方法。正如你所说的,如果出现标题名相同的情况,就会出现误差,更何况有的程序没有窗口。所以,此方法不正确。

判定某个程序已打开的正确方法是:在进程中找到该程序的名称(含路径),如果存在,说明该程序已打开,否则就是未打开。

Private Sub Command3_Click()
On Error Resume Next
Dim s, objWMIService, colProcessList, objProcess
s = "C:\Windows\Notepad.exe" '请在此修改为具体程序名称
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _