使用 WinAPI 做出透明底圖與透明視窗

這是透過 user32.dll 呼叫 WinAPI 做出透明底圖與透明視窗,甚至達成淡出的效果。分享給大家參考!
完整壓縮檔Transparent.zip (內含示範程式Demo.vi

如果您覺得我的程式不錯,請推薦喔!

![](upload://fF7jHORZH5Ev038SWMVGXkheYGo.gif)

franklin40400.7033912037

謝謝 franklin 提供這個挺有趣的程式範例

想請問一下~裡面的FindWindowA函式的參數如下:

HWND WINAPI FindWindow(
  __in_opt  LPCTSTR lpClassName,
  __in_opt  LPCTSTR lpWindowName
);

所以輸入的類型應該是STR和輸出為HWND(應該也是str),不過 franklin 的程式的lpszClassName及hWnd卻用int32的類型~想請問這之間的關係??為什麼可以這樣使用??

 

[QUOTE=wei724]
所以輸入的類型應該是STR和輸出為HWND(應該也是str),不過 franklin 的程式的lpszClassName及hWnd卻用int32的類型~想請問這之間的關係??為什麼可以這樣使用??

[/QUOTE]

我只會一點點而已,很多東西也不太懂,但從 msdn 裡找到 hWnd 的資料形態屬於 long (也就是 int32),請參考以下連結。
http://msdn.microsoft.com/en-us/library/ms821625.aspx

而 lpClassName 是 String 沒有錯,但目前多數的應用都是帶入 NULL String,也就是 ASCII code 0x00,為了方便,所以直接將 0 帶入,否則還要自己刻印出 NULL String 好麻煩 (我是懶惰的人,但在程式中有標示該數值是 Null,很抱歉造成您的誤解)。
(If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter.)
![](upload://jrMCDAXnp8ZoRS1x9qYCiCrcroJ.gif)
有不懂的可以再到 msdn 裡面找答案喔!希望對您有幫助。

 

另外,以下是從網路上找的:

認識 hwnd (Handle of Window)

在VB裡,hwnd等於視窗控制代碼。

也可以說是門牌號碼,每當一個應用程式啟動時,Windows都會發給他一組hwnd碼

若你能取得hwnd,就可以達到許多很霸道的功能喔!

會使用到hwnd的API:

GetMessage
RegisterHotKey
SendMessage
PostMessage
CreateWindowEx
IsWindow
IsChild
DestroyWindow
ShowWindow
FlashWindow
CloseWindow
MoveWindow
SetWindowPos
IsWindowVisible
BringWindowToTop
GetWindowThreadProcessId

這還只是部分而已喔!


--------------------------------------------------------------------------------

既然hwnd這麼厲害,現在就來教大家如何取得hwnd

【方法一】用 ClassName 或 視窗標題來找

使用API: FindWindow

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

用法:

Dim hwnd As Integer

hwnd = FindWindow(VbNullString, "視窗標題")

hwnd = FindWindow("ClassName", VbNullString)

或是

hwnd = FindWindow("ClassName", "視窗標題") '最精準的


--------------------------------------------------------------------------------

【方法二】用座標來找(滑鼠座標)

使用API: WindowFormPoint

Public Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Integer, ByVal yPoint As Integer) As Integer

Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (ByRef lpPoint As POINTAPI) As Integer


Public Structure POINTAPI
        Dim x As Integer
        Dim y As Integer
End Structure

用法:(請將此程式碼放在Timer裡)

Dim p As New POINTAPI
GetCursorPos(p) '取得滑鼠游標所在位置
Dim hwnd As Integer
hwnd = WindowFromPoint(p.x, p.y)

當然你也可不要用GetCursorPos(),如果你知道座標可以直接用WindowFromPoint(x, y)


--------------------------------------------------------------------------------

【附錄】取得ClassName的函數(自製):

Imports System.Text

Public Declare Auto Function GetClassName Lib "user32" (ByVal hWnd As IntPtr, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer

Public Function JLGetClass(ByVal hwnd As Integer) As String
    Dim className As New StringBuilder(255)
    GetClassName(hwnd, className, className.Capacity)
    Return className.ToString()
End Function

用法:

先用FindWindow找到hwnd後,傳入函數中

JLGetClass(hwnd)

franklin40407.423275463

收下了 , 謝謝

請問一下, 如果輸入參數中有結構指標, 這樣要怎嚜帶阿??