VB怎样区分同名窗口?
来源:百度知道 编辑:UC知道 时间:2024/09/18 07:39:37
就是这个.
我的意思是:
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 _