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 
  
    
晚了,明天繼續~! |