GetWindowThreadProcessId,這次玩玩視窗進程,我估計有些人只要看見與進程有關的東東也會變得興奮,呵呵!好了,先看看這個API是什麼樣的?如下:
Private Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
看表面意思:Get(獲取)Window(窗口)Thread(線程)Process(程式)Id(ID),組合:獲取當前線程的視窗進程ID。至於進程ID要著有什麼用,自己以後深入32編程就知道了。
看看參數,ByVal hwnd As Long,哈哈,熟悉吧,一個hWnd控制碼。lpdwProcessId As Long這個就是咱們需要的進程ID,老規矩,新建標準EXE,添加一個CommandButton,屬性:Caption=獲取視窗進程ID。代碼如下:
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Sub Command1_Click()
Dim PID As Long
GetWindowThreadProcessId Me.hwnd, PID
MsgBox "視窗進程的ID是:" & PID
End Sub
我已經習慣了給大家分析了。首先看看第一個參數,ByVal hwnd As Long,又是控制碼來的(問:廢話!答:教會了你也別這樣啊),lpdwProcessId As Long,這個就要注意了,看看這個參數的傳遞方式,是以ByRef進行傳遞的(問:呵呵,不懂什麼意思?答:不懂?轉回去看過程函數這章),也就是說ByRef是以位址進行傳遞的,過程中可以改變傳遞的參數值。明白了嗎?還不明白的話回去乖乖看書吧!現在明白了傳遞方式,也就是說我們聲明的PID是用來獲取視窗進程ID的,厲害啊。
F5,運行之,點擊Command1,PID出來了吧?沒出來我馬上從十樓跳下去。
溫馨小提示^_^:hWnd可以傳入其他視窗控制碼,同樣可以獲取其他視窗進程ID。
接下來我們再來看看Set(設置),Set什麼呢?當然還是Window(視窗)容易些,先列出幾個常用的API:
SetWindowLong、Se●綜合木馬網站●ont=新細明體]、Se●綜合木馬網站●ont=新細明體]、SetWindowText
接上面的。
首先咱們先看SetWindowText,咱們在上面講過GetWindowText這個API,GetWindowText是用來獲取視窗文本的,而這個正好相反。現在可以看看表面意思Set(設置)Window(視窗)Text(文本),好了這樣理解就夠了,我們已經知道這個API是設置視窗文本的,接著咱們就到API流覽器中找找這個API,如下:
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
接著咱們看堶惟珨搨n傳遞的參數,一共有兩,第一個ByVal hwnd As Long我就不用說了,傳入控制碼唄,第二個ByVal lpString As String,其中聲明的lpString是字串變數,可想而知,這婸搨n傳入字串,好了,開始實踐。新建一個標準EXE,然後添加一個TextBox控制項,然後再添加一個CommandButton,寫入以下代碼:
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
Private Sub Command1_Click()
SetWindowText Text1.hwnd, "這是咱們設置的文本"
End Sub
呵呵,這個看似比前面的更簡單,不過我還是要囉嗦一下,首先把Text1的控制碼傳入第一個參數,這樣API知道咱們需要操作哪個視窗,第二個是一個字串變數,所以這奡N是我們需要傳入的文本。好了,F5運行,點擊Command1,OK。
再看Se●綜合木馬網站●ont=新細明體],可以說這個API可以看成設置視窗位置,但是最終的實現效果取決於咱們傳遞的參數,好了,在API流覽器中找到這個API,如下:
Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
呵!好傢伙,這個API看起來有些複雜啊?不過別擔心,有我在嘛,我會幫你好好分析的,這媮棌苳j家別光我一個人分析,必須把自己融入進來,咱們一起分析這樣不更有趣?好了,廢話少說,先看第一個參數:
ByVal hwnd As Long
這塈痟N不講了,傳入視窗控制碼
ByVal hWndInsertAfter As Long 好了,看看這個!hwndInstrAfter,可以看到媊悒]函有hwnd字元,這時你可能會說我前面不是已經說過嘛,只要看見包函有hwnd字元的都應該傳入控制碼嘛?呵呵,沒錯,你很聰明,記得我說的話呢!在這婺堣@下你,別驕傲啊!現在咱們好好分析一下這個地方應該傳入哪些參數!打開MSDN,不好意思是英文,這塈痟N把翻譯過來的說明放上來,如下:
hWndInsertAfter -
Long,窗口控制碼。在視窗列表中,視窗hwnd會置於這個視窗控制碼的後面。也可能選用下述值之一:
HWND_BOTTOM
將視窗置於視窗列表底部
HWND_TOP
將窗口置於Z序列的頂部;Z序列代表在分級結構中,視窗針對一個給定級別的視窗顯示的順序
HWND_TOPMOST
將窗口置於列表頂部,並位於任何最頂部窗口的前面
HWND_NOTOPMOST
將窗口置於列表頂部,並位於任何最頂部窗口的後面
可以看到這個地方有四個參數供我們選擇,一般我們會使用第三個API常數和第四個API常數,這幾個API常數都可以在API流覽器中找到,至於具體實現什麼功能我相信大家都知道吧,後面有寫呢!
再看看後面的幾個 x,y,cx,cy 分別為Long變數,我上面講過,Se●綜合木馬網站●ont=新細明體]可以看成設置視窗位置嘛,所以這堬z所當然是傳入相關的座標值,如果忽略則為0,自己可以試下。
ByVal wFlags As Long,這個參數,我又說過,看看字元Flags,呵呵,熟悉吧,所以這堳平抳搨n傳入相關的標識常數,利用咱們以前學過的常數分析法進行分析,Set(S)Window(W)Pos(P)=SWP_ ,可以看到相關的常數了吧?這塈琝漎袺鰡`數的說明發上來大家看下,如下:
SWP_DRAWFRAME
圍繞視窗畫一個框
SWP_HIDEWINDOW
隱藏視窗
SWP_NOACTIVATE
不啟動窗口
SWP_NOMOVE
保持當前位置(x和y設定將被忽略)
SWP_NOREDRAW
視窗不自動重畫
SWP_NOSIZE
保持當前大小(cx和cy會被忽略)
SWP_NOZORDER
保持窗口在列表的當前位置(hWndInsertAfter將被忽略)
SWP_SHOWWINDOW
顯示視窗
SWP_FRAMECHANGED 強迫一條WM_NCCALCSIZE消息進入視窗,即使視窗的大小沒有改變
所以我說過,一個這樣的API他具體實現的功能取決於你所傳遞的參數。假設這堳平抳搨n實現一個視窗永遠置前的功能,首先新建一個標準EXE,輸入以下代碼:
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Sub Form_Load()
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub
晚了,明天繼續~! |