在 VB.NET 專案中若需直接呼叫 Windows 核心 API CreateWindowEx 建立原生視窗,必須透過 P/Invoke 正確宣告簽章,否則易發生堆疊不平衡或存取違規錯誤。
<System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
Public Shared Function CreateWindowEx(
dwExStyle As Integer,
lpClassName As String,
lpWindowName As String,
dwStyle As Integer,
x As Integer,
y As Integer,
nWidth As Integer,
nHeight As Integer,
hWndParent As IntPtr,
hMenu As IntPtr,
hInstance As IntPtr,
lpParam As IntPtr
) As IntPtr
End Function
CreateWindowExW 或 CreateWindowExA。HWND、HINSTANCE 在 VB.NET 皆對應 IntPtr;DWORD 對應 Integer(32 位元無號,VB.NET 無無號整數,若超過 Int32.MaxValue 需用 Long 並轉換)。Marshal.GetLastWin32Error() 取得錯誤碼。強烈建議參考 pinvoke.net 上社群驗證過的簽章,以及 Calvin Hsia 的部落格 深度解析,避免重複造輪子踩坑。