You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中SendMessage的LPARAM移位操作报BC30452错误的解决方法

修正VB.NET中SendMessage调用的BC30452错误

错误原因

你遇到的BC30452错误是因为IntPtr类型不支持移位操作符,且你误解了EM_SETMARGINS参数的传递逻辑:原C#代码是将按钮宽度值左移16位(作为lParam的高16位,对应文本框右边距),而非对指向宽度的指针(ptr2)进行移位。

修正方法

不需要使用Marshal分配内存传递参数,直接将整数参数转换为IntPtr即可,具体修正代码如下:

Dim btnExtend As New Button()
Const EM_SETMARGINS As Integer = &HD3
' wParam=2表示仅设置右边距;lParam高16位为右边距值(按钮宽度)
SendMessage(textBoxFolder.Handle, EM_SETMARGINS, CType(2, IntPtr), CType(btnExtend.Width << 16, IntPtr))

完整嵌入按钮的代码补充

如果需要完整实现文本框内嵌按钮,还需添加按钮的布局绑定逻辑:

' 初始化按钮并绑定到文本框右侧
btnExtend.Size = New Size(25, textBoxFolder.Height - 2)
btnExtend.Location = New Point(textBoxFolder.Width - btnExtend.Width, 1)
btnExtend.Text = "..."
btnExtend.Anchor = AnchorStyles.Top Or AnchorStyles.Right
textBoxFolder.Controls.Add(btnExtend)

' 调用API设置文本框右边距,避免文本被按钮遮挡
Const EM_SETMARGINS As Integer = &HD3
SendMessage(textBoxFolder.Handle, EM_SETMARGINS, CType(2, IntPtr), CType(btnExtend.Width << 16, IntPtr))

注意:需要提前声明SendMessage的API导入:

Imports System.Runtime.InteropServices

<DllImport("user32.dll", CharSet:=CharSet.Auto)>
Private Shared Function SendMessage(hWnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr) As IntPtr
End Function

内容的提问来源于stack exchange,提问作者8oris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:20:21