標籤:控制代碼 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控制其他程式