VB.NET 中的 SendMessage:使用 << operator with LPARAM

问题描述 投票:0回答:1

使用 VB.net 并按照这篇post,我尝试向文本框添加一个按钮。除了这行代码之外,一切都很顺利:

SendMessage(textBoxFolder.Handle, 0xd3, (IntPtr)2, (IntPtr)(btn.Width << 16));

如何将其转换为 VB.NET?

我在这篇post和这篇article中找到了帮助,然后来到了这里:

 Dim btnExtend As Button = New Button()
 Dim ptr1 As IntPtr
 Dim ptr2 As IntPtr
 Dim n As Integer = 2
 ptr1 = Marshal.AllocHGlobal(4)
 ptr2 = Marshal.AllocHGlobal(4)
 Const EM_SETMARGINS As Integer = &HD3
 Dim p As Integer = btnExtend.Width
 Marshal.WriteInt32(ptr1, n)
 Marshal.WriteInt32(ptr2, p)
 SendMessage(Me.Handle, EM_SETMARGINS, ptr1, ptr2 << 16)
 Marshal.FreeHGlobal(ptr1)
 Marshal.FreeHGlobal(ptr2)

我在

ptr2 << 16
部分收到 bc30452 错误(未为类型 '' 和 '' 定义运算符 '')。我该如何纠正?

.net vb.net sendmessage
1个回答
0
投票

<<
>>
是位移运算符。这些运算符是在 VB.NET 中定义的,但看起来不适用于
IntPtr
类型。我没有检查过,但我猜想 C# 中也会出现这种情况。这意味着,如果您有一个
IntPtr
开始,您需要将其转换为适当的整数类型 - 可能是
Integer
Long
- 并对其进行位移,然后转换回来,例如

Dim p1 As IntPtr

'...
Dim p2 = CType(CInt(p1) << 16, IntPtr)
© www.soinside.com 2019 - 2024. All rights reserved.