vb SendMessage

时间:2019.10.02 发布人:linbozhe

vb SendMessage

已解决问题

谷歌linbozhe用户在2019.10.02提交了关于“羊肉泡馍vb SendMessage”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-12T21:01:06。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,你就是当代的活雷锋,太感谢了 !

希望以下的回答,能够帮助你。

第1个回答

用户名:mike8haomao  

1.
对于Win32标准类型来说,并问答没有String这个而条企德庆叫雷类型,Win32API中对于字符串只脱输聚端有以下类型(C语言)
L知未沉承我永克搞PSTR
==
char
*
LPCSTR
==
const
char
*
LPWSTR
==
wc结切水运压出气零har_t
*
LP假率CWSTR
==
const
wchar_t
*
对于VB来说,St国黑评环剂木责草确ring类型相对于OLE中VC是BSTR,不是通用的Win32API类型。
看看API中的定序首章希任伯带义SendMessage界动氢肉蛋错一象现是用的
lParam
As
Any,没有ByVal,权甚传逐即是按地址传递的,就是企样永Str(0)这个变量的内存地址,如果你知道有一个隐藏函数ValPtr也可以新斤基差信由销液章这样写:
SendMessage
***.hwnd,
EM_GETLINE,
2,
ByVal
ValPtr(那坚减造额福乱供架扩Str(0))
定义一个Byt孙拉孩厚谈e的数组而不是St里ring,是因为在Win32Api中,所有的字符串都是的字符数组,标准的C语言是没有字符串类型的。
SendMessage
***.hwnd,
EM_GETLINE,
2,
Str(0)
这句话的意思就是,给Text1发送一个EM_GETLINE消息,从第2行(最上面一行是第0行)开始读取字符串,并把**存放到地址为Str(0)的空间中。
所以盐甚严低委波在这个地方不能使用S伯或翻按次tring类型,必须使用Byte数组,如果你NB,也可以这样写
Dim
s
As
String
S
=
Space(128)
S(0)
=
Chr(&100h**)
SendMessage
***.hwnd,
意树物EM_GETLINE,
2,
ByVal
StrPtr(皇案革事做王棉元华三远S)
我没有实验,不过理论上可以用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有点了解的话,我相信对于理解这个问题会有改善的。