用VB5.0獲取正在系統中運行的窗口標題

發表于:2007-07-14來源:作者:點擊數: 標簽:
作者:山東(德州 胥智強) 熟悉Visual Basic的讀者都知道,AppActivate語句是激活一個應用程序窗口其后所帶的參數是指要被子激活的應用程序窗口標題條的字符串。如果要激活的是一個常見的應用程序,我們在編寫程序時就可以直接寫上此程序的窗口標題。例如,
作者:山東(德州 胥智強)

熟悉Visual Basic的讀者都知道,AppActivate語句是激活一個應用程序窗口其后所帶的參數是指要被子激活的應用程序窗口標題條的字符串。如果要激活的是一個常見的應用程序,我們在編寫程序時就可以直接寫上此程序的窗口標題。例如,我們想激活Windows95的計算器,可先運行程序x=SHELL("Calc.exe",1),然后再激活計算器窗口AppActivate“計算器”,則程序焦點自動轉到計算器窗口上。然而單純使用該方法局限性非常大,比如上述例子,如果我們放在英文Windows95上運行,計算器的窗口標題就不是“計算器”,而是“Calculator”。再一個局限性就是在很多情況下我們并不知道要激活的程序窗口標題名稱,如何編制一個能自動查找程序窗口標題名稱的程序是本文要解決的問題。

    我們可以采取如下辦法,來獲取正在系統運行的窗口標題。

    在WindowsAPI中有一個函數:

        Get Windows (ByVal hWnd As Long ,ByVal wCmd As Long) As Long

    其中,hWnd是當前窗口句柄,wCmd是與hWnd有聯系的常量,其含義如下:

wCmd值
含義

GW-GHILD
第一個子窗口

GW-HWNDFIRST
子窗口的第一兄弟窗口,其第一個頂層窗口

GW-HWNDLAST
子窗口的最后一個兄弟窗口,或最后一個頂層窗口

GW-HWNDNEXT
后繼窗口

GW-HWNDPRCV
先前窗口

GW-OWNER
窗口擁有者


    此函數返回值是wCmd所指的窗口的句柄。

    我們利用此句柄 ,再用函數Get WindowsText (ByVal hWnd As Long ,ByVal Ipstring As String, ByVal clearcase/" target="_blank" >cch As Long) As Long,將句柄hWnd指定的窗口標題放入一個字符串變量Ipstring中,cch是指放入Ipstring中的最大字符數。此函數成功時返回字符串長度,如果窗口無標題則返回零。

    在使用Get WindowsText函數前,還要先用函數Get WindowsTextLength (ByVal hWnd As Long )As Long得到hWnd指定窗口標題的長度,放入cch中。

    自編一個過程FindTitle()查找系統中正在運行的所有標題,首先獲得第一個頂層窗口句柄currwnd,而后采用While…Wend循環結構,當currwnd不為零而且標題文本長度不為零時,將獲得的標題存入列表框Combo1,再找后繼窗口的句柄,當句柄currwnd=0時表示已沒有了后繼窗口,退出循環。這樣就將系統中所有的窗口句柄及標題找出來了。

    然而調試中發現用此方法找到的窗口標題非常多,這說明Windows系統運行時有許多隱含的窗口,而這些窗口是我們所不需要的,而且用AppActivate激活時也出現錯誤。

    因此我們再自編一個過程Sift ()查找可激活的窗口。其方法是用AppActivate逐個激活所有窗口,出現錯誤的丟掉,保留可激活的窗口標題,放入列表框Combo2。

    首先新建窗體Form1,Caption=“獲取窗口標題”,在窗體Form1上建立兩個標簽,Label1,Caption=“所有窗口標題”,Label2.Caption=“可激活的窗口標題”;建立兩個下拉列表框,Combo1存放系統中的所有標題名稱,Combo2存放可激活的標題名稱;再建立兩個命令按鈕,Command1.Caption=“激活窗體”,可對所列窗體進行測試,命令按鈕Command2.Caption=“刷新”,點擊它可重新查找所有在系統中的窗體名稱,當本程序運行以后又運行了新程序時使用此按鈕。

    從VB系統菜單上選取Project中的Add Module,將下述API函數及一些常量錄入。

’Module 模塊

Declare Function GetWindow Lib "user32"(ByVal hwnd As Long, ByVal wCmd As Long)As Long

Declare Function GetWindowText Lib "user32" Aias"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String,ByVal cch As Long)As Long

Declare Function GetWindowText Length Lib "user32" Aias"GetWindowTextLengthA" (ByVal hwnd As Long)As Long

Public Const GW-HWNDFIRST=0

Public Const GW-HWNDLAST=1

Public Const GW-HWNDNEXT=2

Public Const GW-HWNDPREV=3

Public Const GW-OWNER=4

    建立兩個子程序:

Sub FindTitle ()

’查找桌面上的所有窗口標題

Dim currwnd As Integer

Combo1.Clear

Currwnd=GetWindow (hwnd, GW-HWNDFIRST)

While currwnd<>0

Length= GetWindow TextLength (currwnd)

listitem$=Space $(length +1)

length= GetWindow Text (currwnd,listitem$,length+1)

if length>0 Then

Combo1.Addltem listitem $

End if

currwnd= GetWindow (currwnd, GW-HWNDNEXT)

if Combl1.ListCount>0 Then

Combo1.Text=Combol.List (0)

Combo1.Listindex =0

Else

MsgBox“沒有發現可活動的窗口”,16,“活動”

End if

Wend

End Sub

Sub Sift ()

’測試窗口能否活動

i=0

Combo2.Clear

Do

On Local Error Resume Next

AppActivate Combo1.List (i)

If Err =0 Then

Combo2.Additem Combo1.List(i)

End if

i=i+1

Loop Unti 1 i=Combo1.ListCount-1

AppActivate Form1.Caption

If Combo2.ListCount>0 then

Combo2.Text =Combo2.List (0)

Combo2.Listindex =0

Else

MsgBox “沒有發現可活動窗口”,16,“活動”

End if

End Sub

Private Sub Form-Load ()

Form1.Show’首先將本窗體顯示出來,否則查找出的窗體標題沒有本身

MsgBox "開始查找窗口標題"

Call FindTitle

Call Sift

End Sub

Private Sub Command1-Click ()

F $=Combo2.Text

On Local Error Resume Next

AppActivate F $

End Sub

Private Sub Command2-Click ()

Call FindTitle

Call Sift

End Sub

    本程序在Visual Basic5.0上調試通過。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97