关于API函数SendMessage的EM_EXSETSEL的问题,100分求解!!

VampireB 2005-12-16 03:06:16
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long

Public Const FR_DOWN = &H1

Public Const WM_USER = &H400
Public Const EM_FINDTEXT = WM_USER + 56
Public Const EM_FINDTEXTEX = WM_USER + 79
Public Const EM_EXSETSEL = WM_USER + 55
Public Const EM_SETTEXTEX = WM_USER + 97

Type charrange
cpMin As Long
cpMax As Long
End Type

'and lParam is a findtext structure:
Type FindText
chrg As charrange
lpstrText As String
End Type

Type charrangeFind
cpMin As Long
cpMax As Long
End Type
`------------------------
Private Sub Command1_Click()
Dim star As Long
Dim fText As FindText
Dim cRange As charrange
Dim chrgText As charrangeFind
With cRange
.cpMin = 0
.cpMax = LenB(StrConv(Form1.RichTextBox.Text, vbFromUnicode))
End With
With fText
.chrg = cRange
.lpstrText = TextFind.Text
'.chrgText = cRangeFind
End With
Form1.RichTextBox.SelStart = 0
lReturn = SendMessage(Form1.RichTextBox.hwnd, EM_FINDTEXTEX, FR_DOWN, fText)
With chrgText
.cpMin = lReturn
.cpMax = lReturn + LenB(StrConv(TextFind.Text, vbFromUnicode))
End With
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, chrgText
End Sub

以上,是我做的一个在中进行查询字符串的程序,前面查找都正常,可是总是在最后一句进行定位的chrgText报“参数类型不对”,请问是什么意思啊?谁能帮帮我啊
...全文
492 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
faysky2 2005-12-16
  • 打赏
  • 举报
回复
因为函数在声明的时候是FindText类型,而chrgText是charrangeFind类型,所以会报“参数类型不对”,可以再添加一个函数,把FindText类型改为charrangeFind类型:

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As charrangeFind) As Long

Public Const FR_DOWN = &H1

Public Const WM_USER = &H400
......



yorkness 2005-12-16
  • 打赏
  • 举报
回复
问题解决了吗?
faysky2 2005-12-16
  • 打赏
  • 举报
回复
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, chrgText
----------------------------------------
上面这句改一下:
SendMessage Form1.RichTextBox.hwnd, EM_EXSETSEL, 0, fText
tztz520 2005-12-16
  • 打赏
  • 举报
回复
参数是FindText类型的呀..
rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
to myhgyp(也许是这样的,信不信由你) :

//sFileName = MidB$(StrConv(Rich.Text, vbFromUnicode), charOffset + 1, LineLength) '取行内容
Debug.Print sFileName

这样取,太笨拙了,你可以看看:
http://community.csdn.net/Expert/TopicView3.asp?id=4405082
rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
恩?程序呢?再贴一次:
Option Explicit
'typedef struct _charrange {
' LONG cpMin;
' LONG cpMax;
'} CHARRANGE;

'typedef struct _findtextex {
' CHARRANGE chrg;
' LPCTSTR lpstrText;
' CHARRANGE chrgText;
'} FINDTEXTEX;
Private Type CHARRANGE
cpMin As Long
cpMax As Long
End Type
Private Type FINDTEXTEX
chrg As CHARRANGE
lpstrText As String
chrgText As CHARRANGE
End Type
Private Const FR_DOWN = &H1
Private Const FR_MATCHCASE = &H4
Private Const FR_WHOLEWORD = &H2
Private Const FR_REPLACE = &H10
Private Const FR_REPLACEALL = &H20
Private Const FR_NOWHOLEWORD = &H1000
Private Const FR_NOUPDOWN = &H400
Private Const FR_NOMATCHCASE = &H800
Private Const WM_USER = &H400
Private Const EM_FINDTEXTEX = WM_USER + 79
Private Const EM_GETTEXTLENGTHEX = (WM_USER + 95)

' /* flags for the GETTEXTLENGTHEX data structure */
Private Const GTL_DEFAULT = 0& ' /* do the default (return ' # of chars) */
Private Const GTL_USECRLF = 1& ' /* compute answer using CRLFs for paragraphs*/
Private Const GTL_PRECISE = 2& ' /* compute a precise answer */
Private Const GTL_CLOSE = 4& ' /* fast computation of a "close" answer */
Private Const GTL_NUMCHARS = 8& ' /* return the number of characters */
Private Const GTL_NUMBYTES = 16& ' /* return the number of _bytes_ */

Private Const CP_ACP = 0 ' default to ANSI code page
Private Const CP_NONE = 0 ' No clipping of output
Private Const CP_OEMCP = 1 ' default to OEM code page
Private Const CP_RECTANGLE = 1 ' Output clipped to rects
Private Const CP_REGION = 2 '
Private Const CP_WINANSI = 1004 ' default codepage for windows old DDE convs.
Private Const CP_WINUNICODE = 1200

' /* EM_GETTEXTLENGTHEX info; this struct is passed in the wparam of the msg */
Private Type GETTEXTLENGTHEX
flags As Long ' /* flags (see GTL_XXX defines) */
codepage As Long ' /* code page for translation (CP_ACP for default,1200 for Unicode */
End Type

Private Const EM_SETSEL = &HB1
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Command1_Click()
Dim textlength As Long
Dim mGetTextLengthEx As GETTEXTLENGTHEX
mGetTextLengthEx.codepage = 2
mGetTextLengthEx.flags = GTL_NUMBYTES
Dim i As Long
i = SendMessage(Me.RichTextBox1.hwnd, EM_GETTEXTLENGTHEX, VarPtr(mGetTextLengthEx), ByVal 0&)
Dim mFINDTEXTEX As FINDTEXTEX
mFINDTEXTEX.chrg.cpMin = 0
mFINDTEXTEX.chrg.cpMax = i
mFINDTEXTEX.chrgText.cpMin = -1
mFINDTEXTEX.lpstrText = TextFind.Text
Call SendMessage(Me.RichTextBox1.hwnd, EM_FINDTEXTEX, FR_DOWN, mFINDTEXTEX)
Me.RichTextBox1.SetFocus
SendMessage Me.RichTextBox1.hwnd, EM_SETSEL, mFINDTEXTEX.chrgText.cpMin, ByVal mFINDTEXTEX.chrgText.cpMax
End Sub

Private Sub Form_Load()
'Text1.PasswordChar = "as"
Me.RichTextBox1.LoadFile "e:\mc\mc.txt", rtfText
End Sub


rainstormmaster 2005-12-16
  • 打赏
  • 举报
回复
//Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long

不要这样修改SendMessage的声明
实在想要修改的话,也建议这样修改:
Public Declare Function SendMessageFindText Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As FindText) As Long
以免造成混乱

下面是我写的程序
myhgyp 2005-12-16
  • 打赏
  • 举报
回复
'完整示例
Option Explicit

Public Type CHARRANGE
cpMin As Long
cpMax As Long
End Type
Public Type FINDTEXTEX
chrg As CHARRANGE
lpstrText As String
chrgText As CHARRANGE
End Type
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const LB_SETITEMHEIGHT = &H1A0 '用于设置ListBox行高
Const CB_SETITEMHEIGHT = &H153 '用于设置ComboBox行高
Const EM_GETLINECOUNT = &HBA '用于计算总行数
Const EM_GETLINE = &HC4 '用于获取行内容
Const EM_FINDTEXTEX = &H44F '用于用户搜索设置
Const EM_FINDTEXT = &H438 '基本同上
Const EM_EMPTYUNDOBUFFER = 205
Const EM_CANUNDO = 198
Const EM_GETMODIFY = 184
Const EM_SETMODIFY = 185
Const EM_UNDO = 199
Const EM_SETSEL = &HB1
Const EM_CANPASTE = 1074
Const EM_GETFIRSTVISIBLELINE = 206
Const EM_LINEFROMCHAR = 201
Const EM_LINEINDEX = 187
Const EM_LINELENGTH = 193
Const EM_EXLINEFROMCHAR = 1078
Const EM_LINESCROLL = 182
Const EM_SCROLLCARET = 183
Const EM_SETTABSTOPS = 203
Private Sub Command2_Click()
Dim FindX As FINDTEXTEX
Dim sFileName As String
Dim Lines
Dim WinH As Long
Dim i As Integer
Dim LineLength As Long
Dim charOffset As Long
WinH = Rich.hwnd
Lines = SendMessage(WinH, EM_GETLINECOUNT, 0, 0)
For i = 0 To Lines - 1
charOffset = SendMessage(WinH, EM_LINEINDEX, i, 0) '获得当前行开始位置
LineLength = SendMessage(WinH, EM_LINELENGTH, charOffset, 0) '行长度
sFileName = MidB$(StrConv(Rich.Text, vbFromUnicode), charOffset + 1, LineLength) '取行内容
Debug.Print sFileName
Next i
Dim s As String
s = StrConv("sam", vbFromUnicode)
FindX.lpstrText = "sam" '搜索“sam”
FindX.chrg.cpMax = LenB(StrConv(Rich.Text, vbFromUnicode))
FindX.chrg.cpMin = 0
Call SendMessage(WinH, EM_SETSEL, FindX.chrgText.cpMin, FindX.chrgText.cpMax)
Rich.SetFocus
End Sub
源码直接下载地址: https://pan.quark.cn/s/1c143f32ee83 华为作为全球领先的通信设备供应商,其产品系列广泛涉及各类网络设备,其中包括我们接下来要探讨的上网卡产品。华为上网卡驱动程序是一种专门为华为品牌旗下多种型号上网卡开发的软件模块,其主要功能在于保障这些设备与计算机操作系统的无缝对接。涉及的型号涵盖EC8189、EC226、EC169C、EC360、EC1260、EC1261、EC189、EC122、EC150以及EC168,这些均是由华为公司推出的移动宽带调制解调器,旨在通过移动网络实现便捷的互联网接入服务。驱动程序在计算机系统中的地位举足轻重,它充当了硬件设备与操作系统之间的媒介,负责对硬件设备发出的指令进行解读和执行,并将操作系统的指令传递给硬件设备。华为上网卡驱动程序的及时更新和精准安装是保障设备稳定运作和性能达到最优的关键因素。"天翼宽带安装程序V1.3.3.exe"是由中国电信提供的一个整合性软件包,内含华为上网卡的驱动程序及配套的管理工具。用户可借助此安装程序来执行华为上网卡的相关驱动安装及更新,同步享受中国电信的3G或4G网络服务。版本标识V1.3.3代表软件经过迭代优化,通常包含了对错误的修正、性能的改善以及新功能的引入。 "SetupInfo.xml"作为安装程序的配置文档,其中收录了安装流程中的各项设定和元数据信息,例如安装流程、文件定位、依赖条件等。它是安装程序在执行时参照和遵循的纲领,旨在确保安装流程按既定方案进行。文件名"CT_HW_EVDO_Driver"或许指向华为的EVDO(Evolution-Data Optimized)驱动程序,EVDO是一种3G无线通信规范,具备高速数据传输的特性。该驱动可...
内容概要:本文围绕【博士论文复现】基于小信号扫频辨识的光伏并网逆变器正负序交互稳定性析展开,结合Matlab代码与Simulink仿真实现,系统研究了光伏并网逆变器在弱电网环境下的正负序阻抗建模与交互稳定性问题。重点采用小信号扫频法进行系统辨识,获取逆变器的正负序阻抗特性,并通过奈奎斯特稳定判据等方法析其在不同电网强度下的稳定性表现。文中详细阐述了扫频激励信号的设计原理、频域响应数据的提取与处理流程、阻抗模型的拟合与验证方法等关键技术环节,实现了对逆变器在复杂电网条件下动态交互行为的精确刻画。该研究不仅深入揭示了新能源并网系统中潜在的宽频振荡机理,也为提升系统稳定性、优化控制器设计提供了坚实的理论依据和有效的技术手段。; 适合人群:具备电力电子、自动控制及电力系统基础知识,从事新能源并网、电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握基于小信号扫频法的电力电子装置阻抗建模方法;② 深入理解光伏并网逆变器在弱电网下的正负序交互稳定性机理;③ 学习并复现高水平博士论文中的核心仿真技术,提升科研实践能力;④ 为实际工程中新能源并网系统的稳定性析、振荡问题诊断与控制器优化设计提供理论支持和技术参考。; 阅读建议:学习者应结合提供的Matlab代码与Simulink模型,深入理解扫频辨识的原理与实现步骤,重点关注锁相环、电流控制环等关键模块对系统阻抗特性的影响,并尝试改变系统参数以观察稳定性变化,从而加深对理论知识的掌握。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 OPC(OLE for Process Control)是由微软推出的一种应用于工业自动化场景下的数据交换规范,其目的是使多样化的自动化装置与软件平台之间能够实现信息互通。在本项研究中,我们集中探讨的是一个运用C#语言构建的完整OPC客户端的源代码实现。该客户端具备与OPC服务器建立连接、获取或设置数据的能力,从而促成设备间的协同工作。鉴于C#是.NET框架的核心编程语言,并且拥有丰富的类库资源及强大的面向对象支持,它特别适合用于开发此类工业环境的应用程序。接下来将针对OPC客户端源代码中可能涉及的核心技术要点进行详尽的阐述: 1. **OPC Foundation .NET库**:为了在C#环境下实现OPC通信功能,开发人员通常会选择采用OPC Foundation提供的.NET库,例如OPC-UA .NET Standard或OPC Classic .NET。这些库提供了操作OPC服务器的必要API,涵盖了建立连接、遍历服务器节点、读取与写入数据等一系列操作。 2. **OPC连接配置**:客户端在运行前必须先与OPC服务器建立通信通道。这一过程通常需要配置服务器的位置信息、身份验证凭证(包括用户名和密码)以及连接的详细参数。在源代码中,可能会包含一个`Connect()`方法来处理这些连接细节。 3. **数据项订阅机制**:OPC客户端通过向服务器订阅数据项来实时获取数据更新。在订阅阶段,客户端会指定需要监控的数据项的唯一标识,并设定当数据发生变化时触发的回调函数。在C#编程语言中,这一过程可能通过`AddSubscription()`和`AddItem()`方法来完...

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧