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
相关产品推荐
相关产品推荐

