vb代碼之------FindWindow and FindWindowEx控制其他程式

來源:互聯網
上載者:User

標籤:控制代碼   log   set   else   分享   win   parent   target   orm   

 

  應該有不少童鞋都喜歡用自己的程式來控制其他程式吧,但是又恨自己技術淺,那麼今天給大家帶來一個簡單的vb控制器

  在此之前,我想說一下控制代碼

  對於Win32程式員來說,如果不知道控制代碼,那麼也太遜了吧,那控制代碼是什麼呢?百度百科是這樣說的 "個控制代碼是指使用的一個唯一的整數值,即一個4位元組(64位程式中為8位元組)長的數值,來標識應用程式中的不同對象和同類中的不同的執行個體"

  首先,你可以知道控制代碼是一個整數,這個不難理解吧,還有是用來標識應用程式的執行個體,也就是一個整數標識了一個應用程式。在作業系統中,每一個程式(視窗、按鈕......)等都會有一個控制代碼,我們只要抓住他的控制代碼,就可以對應的對她進行操作。

  好了,廢話不多說,咋們開始敲吧

  

好了,看到這個圖了吧,咋們就用vb來控制這個文字框的內容(上面的程式是Win7中內建的程式 《便箋》)

要使用的兩個主要函數FindWindow 和 FindWindowEx

在vb中要先聲明,如下

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 

增益集函數

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_SETTEXT As Long = &HC

解釋函數

FindWindow:

尋找視窗列表中第一個符合指定條件的最上層視窗(在vb裡使用:FindWindow最常見的一個用途是獲得ThunderRTMain類的隱藏視窗的控制代碼;該類是所有運行中vb執行程式的一部分。獲得控制代碼後,可用api函數GetWindowText取得這個視窗的名稱;該名也是應用程式的標題)

FindWindowEx:

在視窗列表中尋找與指定條件相符的第一個子視窗

SendMessage:

如果不理解Windows的訊息機制,那麼這個函數不是很好理解,最簡單的說法就是給一個視窗發送訊息

 

首先,我們用Spy++看一下便箋中所有的控制代碼

然後用尋找工具找到文字框的類名

 

 可以看到,文字框的類名是{a64c3a50-b714-4e1f-a723-78db57a20a29},我們不能直接尋找這類名,要從他的爸爸的表單中尋找

他的爸爸有DirectUIHWND、CtrlNotifySink

好了,首先用FindWindow找到這個程式的視窗

Dim hw As Long
Dim hw2 As Long
hw = FindWindow(vbNullString, "便箋")

hw這個變數中就存放了便箋這個程式的控制代碼

然後

hw2 = FindWindowEx(hw, 0, "DirectUIHWND", vbNullString)

hw2存放了hw的兒子DirectUIHWND

接著

hw2 = FindWindowEx(hw2, 0, "CtrlNotifySink", vbNullString)

此時的hw2中存放了DirectUIHWND的兒子CtrlNotifySink

最後找到文字框

hw2 = FindWindowEx(hw2, 0, "{a64c3a50-b714-4e1f-a723-78db57a20a29}", vbNullString)

這個hw2中存放了我們要找的文字框,也就是hw的兒子的兒子的兒子

好了,文字框的控制代碼我們找到了,接下來怎麼設定他的內容呢

還需要一個函數

SendMessage

用這個函數給文字框發送一個WM_SETTEXT訊息

 

 SendMessage中lParam中附加了訊息的內容

代碼如下

SendMessage hw2, WM_SETTEXT, 0, ByVal "我是被vb程式改變的內容"

全部代碼

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Const WM_SETTEXT As Long = &HC

 

Private Sub Form_Load()
Dim hw As Long
Dim hw2 As Long
hw = FindWindow(vbNullString, "便箋")
If hw <> 0 Then

hw2 = FindWindowEx(hw, 0, "DirectUIHWND", vbNullString)
hw2 = FindWindowEx(hw2, 0, "CtrlNotifySink", vbNullString)
hw2 = FindWindowEx(hw2, 0, "{a64c3a50-b714-4e1f-a723-78db57a20a29}", vbNullString)
If hw2 <> 0 Then
SendMessage hw2, WM_SETTEXT, 0, ByVal "我是被vb程式改變的內容"

Else
MsgBox "文字框沒有找到"
End If

Else
MsgBox "便箋沒有找到"
End If

End Sub

歡迎加入我的QQ群:183435019一起學習,一起討論

 

vb代碼之------FindWindow and FindWindowEx控制其他程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.