`SendMessage` 等 Win32 API 有**多個重載簽名**,參數類型根據消息類型(`wParam`/`lParam` 含義)而異:
// 通用簽名:使用 IntPtr 兼容所有指針/句柄/整數(推薦)
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
// 特定消息重載:針對 wParam/lParam 為整數值的場景
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
// 字符串專用重載(lParam 為 StringBuilder)
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, StringBuilder lParam);
| 場景 | 用 int 後果 | 正確類型 |
|---|---|---|
| 64 位進程傳遞指針/句柄 | 截斷高 32 位 → 訪問違規/崩潰 | IntPtr (隨平台 32/64 位) |
| 傳遞 32 位整數值 | 正常工作 | int / uint 均可 |
| 傳遞 64 位整數 (LONG_PTR) | 截斷 | IntPtr / long |