
已解决问题
谷歌linbozhe用户在2019.10.02提交了关于“羊肉泡馍vb SendMessage”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-12T21:01:06。希望大家能够帮助她。详细问题描述及疑问:期待您的答案,你就是当代的活雷锋,太感谢了 !
详细问题描述及疑问:期待您的答案,你就是当代的活雷锋,太感谢了 !
1.
对于Win32标准类型来说,并
L
==
char
*
LPCSTR
==
const
char
*
LPWSTR
==
wc
*
LP
==
const
wchar_t
*
对于VB来说,St
看看API中的定
lParam
As
Any,没有ByVal,
SendMessag
***.hwnd,
EM_GETLIN
2,
ByVal
ValPtr(
定义一个Byt
SendMes
***.hwnd,
EM_GETLINE,
2,
Str(0)
这句话的意思就是,给Text1发送一个EM
所以
Dim
s
As
St
S
=
Space(128)
S(0)
=
Chr(&100h**)
SendMe
***.hwnd,
2,
ByVal
StrPtr(
我没有实验,不过理论上可以用StrPtr这个函数的
2.
在Win32API中找到了对于EM_GETLINE第二个参数的定义:
lParam
A
pointer
to
the
buffer
that
receives
a
copy
of
the
line.
Before
sending
the
message,
set
the
first
word
of
this
buffer
to
the
size
,
in
TCh**ARs,
of
the
buffer.
For
ANSI
text,
this
is
the
**mber
of
bytes;
for
Unicode
text,
this
is
the
**mber
of
characters.
The
size
in
the
first
word
is
overwritten
by
the
copied
line.
加粗的地方看懂了吗?意思就是说这个数组的第一个字表示的是可以容纳缓冲区的大小。也就是说Str(0)和Str(1)表示的是缓冲区里面的大小,因为Byte是一个字节,Word是两个字节,内存中0001字节反转之后就是&0100h**就是256,表示这个缓冲区的最大字符容量为256个字节。
3.
默认的情况下,数组的其实部分是从0开始的,定义的时候是定义的长度,而不是上下标。例如
Str(256)对于Str(0)到Str(255)都是有效的。Str(1)在已经解答了,因为要让第一个字第数值为256,所以就必须设置Str(1)=1,而不出Str(0)=1。这个事因为对于x86架构的处理器中是Little-Endian的字节序,高字节在后低字节在前。这个是在《计算机组成原理》中需要重点讨论的。
4.
你仔细看看API定义使用的是
SendMessageA
,而不是SendMessageW,这说明定义的函数使用的是ANSI的字符编码,而不出Unicode,而VB**使用的都是Unicode,所以对于这个问题,最后返回的字符串都是ANSI的,对于这个字符串数组,我们需要同过StrConv对其进行转化为Unicode。
当然你也可以使用SendMessageW,这样最后可以直接***.text=CStr(Str)这个语句直接赋值了。
PS:
如果要弄懂里面的东西,还是需要对于Win32API有所了解,这里面已经涉及到比较高级的VB技术了,如果你对VC有点了解的话,我相信对于理解这个问题会有改善的。