找回密码
 加入
搜索
查看: 7828|回复: 13

[AU3基础] [已解决}求教!如果控制嵌入的 Scite 脚本编辑控件的滚动条自动向下滚动?谢谢!!!

  [复制链接]
发表于 2011-1-16 16:22:34 | 显示全部楼层 |阅读模式
本帖最后由 131738 于 2011-1-16 23:09 编辑

谢谢 lixiaolong 的热心帮助,解决方法见 4 楼!
根据官网脚本修改一个嵌入 Scite 脚本编辑控件的窗口,使用了“马甲”版主修改显示中文 BUG 的代码,

http://www.autoitx.com/forum.php ... p;extra=&page=1

嵌入的 Scite 编辑控件有一个缺点:脚本在 Scite 控件输入文本后(非手动),

垂直滚动条不能自动向下滚动到最后,有关控件焦点、插入符、滚动的函数都使用过了,没有作用!

输入文本后 Send ( "{ENTER}", 1 ) 还是无法解决这个问题!



附上代码及附件,附件中也有代码的!
附件主要是 Scite 控件的 DLL 文件及文本颜色格式的定义文件
运行代码后,点击“写入”按钮就能自动输入一段代码!
先谢谢了!!!
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <string.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <GuiButton.au3>
;Set options
Opt("GUIOnEventMode", 1)

;改变工作目录到应用程序的目录
FileChangeDir(@ScriptDir);更改当前工作目录
#Region 定义常量
Global $ScintillaDir = @ScriptDir & "\Scintilla"
Global $user32 = DllOpen("user32.dll")
Global $kernel32 = DllOpen("kernel32.dll")
Global $hlStart, $hlEnd, $sCallTip
Global $line_Tally = 1
Global Enum $MARGIN_SCRIPT_NUMBER = 0, $MARGIN_SCRIPT_ICON, $MARGIN_SCRIPT_FOLD
Global Const $SC_MARGIN_NUMBER = 1
Global Const $SC_MARGIN_SYMBOL = 0
Global Const $SC_MARK_ARROW = 2
Global Const $SC_MARK_ARROWDOWN = 6
Global Const $SC_MARK_LCORNER = 10
Global Const $SC_MARK_TCORNER = 11
Global Const $SC_MARK_VLINE = 9
Global Const $SC_MARKNUM_FOLDER = 30
Global Const $SC_MARKNUM_FOLDEREND = 25
Global Const $SC_MARKNUM_FOLDERMIDTAIL = 27
Global Const $SC_MARKNUM_FOLDEROPEN = 31
Global Const $SC_MARKNUM_FOLDEROPENMID = 26
Global Const $SC_MARKNUM_FOLDERSUB = 29
Global Const $SC_MARKNUM_FOLDERTAIL = 28
Global Const $SC_MASK_FOLDERS = 0xFE000000
Global Const $SCE_AU3_COMMENT = 1
Global Const $SCE_AU3_COMMENTBLOCK = 2
Global Const $SCE_AU3_COMOBJ = 14
Global Const $SCE_AU3_DEFAULT = 0
Global Const $SCE_AU3_EXPAND = 13
Global Const $SCE_AU3_FUNCTION = 4
Global Const $SCE_AU3_KEYWORD = 5
Global Const $SCE_AU3_MACRO = 6
Global Const $SCE_AU3_NUMBER = 3
Global Const $SCE_AU3_OPERATOR = 8
Global Const $SCE_AU3_PREPROCESSOR = 11
Global Const $SCE_AU3_SENT = 10
Global Const $SCE_AU3_SPECIAL = 12
Global Const $SCE_AU3_STRING = 7
Global Const $SCE_AU3_UDF = 15
Global Const $SCE_AU3_VARIABLE = 9
Global Const $SCI_ADDTEXT = 2001
Global Const $SCI_AUTOCSETIGNORECASE = 2115
Global Const $SCI_AUTOCSETSEPARATOR = 2106
Global Const $SCI_CALLTIPCANCEL = 2201
Global Const $SCI_CALLTIPACTIVE = 2202
Global Const $SCI_CALLTIPSETHLT = 2204
Global Const $SCI_GETCURLINE = 2027
Global Const $SCI_GETCURRENTPOS = 2008
Global Const $SCI_GETLINE = 2153
Global Const $SCI_GETLINEENDPOSITION = 2136
Global Const $SCI_GETSTYLEBITSNEEDED = 4011
Global Const $SCI_GOTOLINE = 2024
Global Const $SCI_GOTOPOS = 2025
Global Const $SCI_LINEFROMPOSITION = 2166
Global Const $SCI_MARKERDEFINE = 2040
Global Const $SCI_MARKERSETBACK = 2042
Global Const $SCI_MARKERSETFORE = 2041
Global Const $SCI_SETFOLDFLAGS = 2233
Global Const $SCI_SETINDENTATIONGUIDES = 2132
Global Const $SCI_SETKEYWORDS = 4005
Global Const $SCI_SETLEXER = 4001
Global Const $SCI_SETMARGINMASKN = 2244
Global Const $SCI_SETMARGINSENSITIVEN = 2246
Global Const $SCI_SETMARGINTYPEN = 2240
Global Const $SCI_SETMARGINWIDTHN = 2242
Global Const $SCI_SETPROPERTY = 4004
Global Const $SCI_SETSTYLEBITS = 2090
Global Const $SCI_SETTABWIDTH = 2036
Global Const $SCI_STYLECLEARALL = 2050
Global Const $SCI_STYLESETBACK = 2052
Global Const $SCI_STYLESETBOLD = 2053
Global Const $SCI_STYLESETFONT = 2056
Global Const $SCI_STYLESETFORE = 2051
Global Const $SCI_STYLESETITALIC = 2054
Global Const $SCI_STYLESETSIZE = 2055
Global Const $SCI_STYLESETUNDERLINE = 2059
Global Const $SCI_TEXTWIDTH = 2276
Global Const $SCI_TOGGLEFOLD = 2231
Global Const $SCLEX_AU3 = 60
Global Const $SCN_CHARADDED = 2001
Global Const $SCN_MARGINCLICK = 2010
Global Const $SCN_SAVEPOINTLEFT = 2003
Global Const $SCN_SAVEPOINTREACHED = 2002
Global Const $STYLE_BRACEBAD = 35
Global Const $STYLE_DEFAULT = 32
Global Const $STYLE_LINENUMBER = 33
#EndRegion 定义常量
;定义全局变量
Global $Main_Win, $TV, $SciControl, $Input, $GUI_EVENT_Button, $Text
;创建 GUI
$Main_Win = GUICreate("Au3DB", 700, 220, (@DesktopWidth - 615) / 2, 3, $WS_POPUP)

$Target_File_Button = GUICtrlCreateButton("写    入", 125, 192, 80, 25, $BS_BITMAP)
GUICtrlSetOnEvent(-1, "Target_File_Button")

$Main_Win_Exit = GUICtrlCreateButton("退    出", 550, 192, 60, 25, $BS_BITMAP)
GUICtrlSetOnEvent(-1, "Win_Exit")

$SciControl = Sci_CreateEditor($Main_Win, 0, 0, 700, 184);创建 SCITE 控件

;显示 GUI
GUISetState()

;主循环
While 1
        Sleep(100)
WEnd
; 添加编辑代码 ===================
Func Target_File_Button() ;"写入"
        $AText = "#requireadmin|"
        $AText &= "#Region AutoIt3Wrapper 预编译参数(常用参数)|"
        $AText &= "#AutoIt3Wrapper_icon = |"
        $AText &= "#AutoIt3Wrapper_outfile = |"
        $AText &= "#AutoIt3Wrapper_Res_Description = |"
        $AText &= "#AutoIt3Wrapper_Res_Comment = |"
        $AText &= "#EndRegion AutoIt3Wrapper 预编译参数设置完成|"
        $AText &= " |"
        $AText &= "#include <GUIConstantsEx.au3>|"
        $AText &= "#include <WindowsConstants.au3>|"
        $AText &= "#Include <GuiListView.au3>|"
        $AText &= "#include <GuiImageList.au3>|"
        $AText &= " |"
        $AText &= 'Opt("MouseCoordMode", 0)|'
        $AText &= " |"
        $AText &= 'Global $hListView, $Path_Fitx, $Path_Fit, $Nem_Path'
        $BText = StringSplit($AText, "|")
        For $i = 1 To $BText[0]
                $Text = $BText[$i]
                GUI_Event_About()
        Next
EndFunc   ;==>Target_File_Button

Func Win_Exit();主、子窗退出函数
        Exit
EndFunc   ;==>Win_Exit
;======================
Func GUI_Event_About();向 SCITE 写入数据
        Sci_AddLines($SciControl, $Text & @CR, $line_Tally);向 SCITE 写入 数据 信息
        $line_Tally += 1
EndFunc   ;==>GUI_Event_About
Func Sci_CreateEditor($Hwnd, $X, $Y, $W, $H) ; 返回窗口句柄, 可用于 Win.. 函数
        $Sci = CreateEditor($Hwnd, $X, $Y, $W, $H)
        If @error Then
                Return 0
        EndIf
        InitEditor($Sci)
        If @error Then
                Return 0
        Else
                Return $Sci
        EndIf
EndFunc   ;==>Sci_CreateEditor
Func CreateEditor($Hwnd, $X, $Y, $W, $H);创建 SCITE 控件
        Local $GWL_HINSTANCE = -6
        Local $hLib = LoadLibrary($ScintillaDir & "\SciLexer.dll")
        If @error Then
                Return 0
        EndIf
        Local $Sci
        $Sci = CreateWindowEx($WS_EX_CLIENTEDGE, "Scintilla", "SciLexer", _
                        BitOR($WS_CHILD, $WS_VISIBLE, $WS_HSCROLL, $WS_VSCROLL, $WS_TABSTOP), $X, $Y, $W, $H, $Hwnd, 0, 0, 0)
        If @error Then
                Return 0
        Else
                If Not IsHWnd($Sci) Then $Sci = HWnd($Sci)
                Return $Sci
        EndIf
EndFunc   ;==>CreateEditor
Func InitEditor($Sci);设置 SCITE 文本颜色格式
        SendMessage($Sci, $SCI_SETLEXER, $SCLEX_AU3, 0)
        Local $bits = SendMessage($Sci, $SCI_GETSTYLEBITSNEEDED, 0, 0)
        SendMessage($Sci, $SCI_SETSTYLEBITS, $bits, 0)
        SendMessage($Sci, $SCI_SETTABWIDTH, 4, 0)
        SendMessage($Sci, $SCI_SETINDENTATIONGUIDES, True, 0)
        
        SendMessageString($Sci, $SCI_SETKEYWORDS, 0, FileRead($ScintillaDir & "\Keywords.txt"))
        SendMessageString($Sci, $SCI_SETKEYWORDS, 1, FileRead($ScintillaDir & "\Functions.txt"))
        SendMessageString($Sci, $SCI_SETKEYWORDS, 2, FileRead($ScintillaDir & "\Macros.txt"))
        SendMessageString($Sci, $SCI_SETKEYWORDS, 3, FileRead($ScintillaDir & "\SendKeys.txt"))
        SendMessageString($Sci, $SCI_SETKEYWORDS, 4, FileRead($ScintillaDir & "\PreProcessor.txt"))
        SendMessageString($Sci, $SCI_SETKEYWORDS, 5, FileRead($ScintillaDir & "\Special.txt"))
        SendMessageString($Sci, $SCI_SETKEYWORDS, 7, FileRead($ScintillaDir & "\UDFs.txt"))
        
        SendMessage($Sci, $SCI_SETMARGINTYPEN, $MARGIN_SCRIPT_NUMBER, $SC_MARGIN_NUMBER)
        SendMessage($Sci, $SCI_SETMARGINWIDTHN, $MARGIN_SCRIPT_NUMBER, SendMessageString($Sci, $SCI_TEXTWIDTH, $STYLE_LINENUMBER, "_99999"))
        SendMessage($Sci, $SCI_SETMARGINWIDTHN, $MARGIN_SCRIPT_ICON, 16)
        SendMessage($Sci, $SCI_AUTOCSETSEPARATOR, Asc(@CR), 0)
        SendMessage($Sci, $SCI_AUTOCSETIGNORECASE, True, 0)
        
        SetStyle($Sci, $STYLE_DEFAULT, 0x000000, 0xFFFFFF, 10, "Courier New")
        SendMessage($Sci, $SCI_STYLECLEARALL, 0, 0)
        SetStyle($Sci, $STYLE_BRACEBAD, 0x009966, 0xFFFFFF, 0, "", 0, 1)
        SetStyle($Sci, $SCE_AU3_DEFAULT, 0x000000, 0xFFFFFF)
        SetStyle($Sci, $SCE_AU3_COMMENT, 0x339900, 0xFFFFFF)
        SetStyle($Sci, $SCE_AU3_COMMENTBLOCK, 0x009966, 0xFFFFFF)
        SetStyle($Sci, $SCE_AU3_NUMBER, 0xA900AC, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_FUNCTION, 0xAA0000, 0xFFFFFF, 0, "", 1, 1)
        SetStyle($Sci, $SCE_AU3_KEYWORD, 0xFF0000, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_MACRO, 0xFF33FF, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_STRING, 0xCC9999, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_OPERATOR, 0x0000FF, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_VARIABLE, 0x000090, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_SENT, 0x0080FF, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_PREPROCESSOR, 0xFF00F0, 0xFFFFFF, 0, "", 0, 0)
        SetStyle($Sci, $SCE_AU3_SPECIAL, 0xF00FA0, 0xFFFFFF, 0, "", 0, 1)
        SetStyle($Sci, $SCE_AU3_EXPAND, 0x0000FF, 0xFFFFFF, 0, "", 1)
        SetStyle($Sci, $SCE_AU3_COMOBJ, 0xFF0000, 0xFFFFFF, 0, "", 1, 1)
        SetStyle($Sci, $SCE_AU3_UDF, 0xFF8000, 0xFFFFFF, 0, "", 1, 1)
        
        SetProperty($Sci, "fold", "1")
        SetProperty($Sci, "fold.compact", "1")
        SetProperty($Sci, "fold.comment", "1")
        SetProperty($Sci, "fold.preprocessor", "1")
        
        SendMessage($Sci, $SCI_SETMARGINWIDTHN, $MARGIN_SCRIPT_FOLD, 0); fold margin width=0
        SendMessage($Sci, $SCI_SETMARGINTYPEN, $MARGIN_SCRIPT_FOLD, $SC_MARGIN_SYMBOL)
        SendMessage($Sci, $SCI_SETMARGINMASKN, $MARGIN_SCRIPT_FOLD, $SC_MASK_FOLDERS)
        SendMessage($Sci, $SCI_SETMARGINWIDTHN, $MARGIN_SCRIPT_FOLD, 20)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDER, $SC_MARK_ARROW)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDEROPEN, $SC_MARK_ARROWDOWN)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDEREND, $SC_MARK_ARROW)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDERMIDTAIL, $SC_MARK_TCORNER)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDEROPENMID, $SC_MARK_ARROWDOWN)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDERSUB, $SC_MARK_VLINE)
        SendMessage($Sci, $SCI_MARKERDEFINE, $SC_MARKNUM_FOLDERTAIL, $SC_MARK_LCORNER)
        SendMessage($Sci, $SCI_SETFOLDFLAGS, 16, 0)
        SendMessage($Sci, $SCI_MARKERSETFORE, $SC_MARKNUM_FOLDER, 0xFFFFFF)
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDERSUB, 0x808080);黑色
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDEREND, 0x808080);黑色
        SendMessage($Sci, $SCI_MARKERSETFORE, $SC_MARKNUM_FOLDEREND, 0x808080);白色
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDERTAIL, 0x808080);黑色
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDERMIDTAIL, 0x808080);黑色
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDER, 0x808080);黑色
        SendMessage($Sci, $SCI_MARKERSETFORE, $SC_MARKNUM_FOLDEROPEN, 0x808080);白色
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDEROPEN, 0x808080);黑色
        SendMessage($Sci, $SCI_MARKERSETFORE, $SC_MARKNUM_FOLDEROPENMID, 0x808080);白色
        SendMessage($Sci, $SCI_MARKERSETBACK, $SC_MARKNUM_FOLDEROPENMID, 0x808080);黑色
        SendMessage($Sci, $SCI_SETMARGINSENSITIVEN, $MARGIN_SCRIPT_FOLD, 1)
        SendMessage($Sci, $SCI_MARKERSETBACK, 0, 0x0000FF)
        GUIRegisterMsg(0x004E, "WM_NOTIFY");注册已知 Windows 消息 ID (WM_MSG) 的用户自定义函数
        If @error Then
                Return 0
        Else
                Return 1
        EndIf
EndFunc   ;==>InitEditor
Func LoadLibrary($lpFileName);加载 SCITE 库文件
        Local $ret
        $ret = DllCall($kernel32, "int", "LoadLibrary", "str", $lpFileName)
        If @error Then Return 0
        Local $hLib = $ret[0]
        Return $ret[0]
EndFunc   ;==>LoadLibrary
Func Sci_AddLines($Sci, $Text, $Line);向 SCITE 写入文本 ;参数 $Sci=编辑框句柄;$Line=0
        $Oldpos = Sci_GetCurrentLine($Sci);获取当前行
        If @error Then
                Return 0
        EndIf
        Sci_SetCurrentLine($Sci, $Line);设置当前行
        If @error Then
                Return 0
        EndIf
        $LineLenght = StringSplit(StringRegExpReplace($Text, '[^\x00-\xff]', '00'), "")
        If @error Then
                Return 0
        EndIf
        DllCall($user32, "long", "SendMessageA", "long", $Sci, "int", $SCI_ADDTEXT, "int", $LineLenght[0], "str", $Text)
        If @error Then
                Return 0
        EndIf
        Sci_SetCurrentLine($Sci, $Oldpos);设置当前行
        If @error Then
                Return 0
        Else
                Return 1
        EndIf
EndFunc   ;==>Sci_AddLines
Func CreateWindowEx($dwExStyle, $lpClassName, $lpWindowName = "", $dwStyle = -1, $X = 0, $Y = 0, $nWidth = 0, $nHeight = 0, $hwndParent = 0, $hMenu = 0, $hInstance = 0, $lParm = 0)
        Local $ret
        If $hInstance = 0 Then
                $ret = DllCall($user32, "long", "GetWindowLong", "hwnd", $hwndParent, "int", -6)
                $hInstance = $ret[0]
        EndIf
        $ret = DllCall($user32, "hwnd", "CreateWindowEx", "long", $dwExStyle, _
                        "str", $lpClassName, "str", $lpWindowName, _
                        "long", $dwStyle, "int", $X, "int", $Y, "int", $nWidth, "int", $nHeight, _
                        "hwnd", $hwndParent, "hwnd", $hMenu, "long", $hInstance, "ptr", $lParm)
        If @error Then Return 0
        Return $ret[0]
EndFunc   ;==>CreateWindowEx
Func SendMessage($Hwnd, $msg, $wp, $lp)
        Local $ret
        $ret = DllCall($user32, "long", "SendMessageA", "long", $Hwnd, "int", $msg, "int", $wp, "int", $lp)
        If @error Then
                SetError(1)
                Return 0
        Else
                SetError(0)
                Return $ret[0]
        EndIf

EndFunc   ;==>SendMessage
Func SendMessageString($Hwnd, $msg, $wp, $str)
        Local $ret
        $ret = DllCall($user32, "int", "SendMessageA", "hwnd", $Hwnd, "int", $msg, "int", $wp, "str", $str)
        Return $ret[0]
EndFunc   ;==>SendMessageString
Func SetStyle($Sci, $style, $fore, $back, $size = 0, $font = "", $bold = 0, $italic = 0, $underline = 0)
        SendMessage($Sci, $SCI_STYLESETFORE, $style, $fore)
        SendMessage($Sci, $SCI_STYLESETBACK, $style, $back)
        If $size >= 1 Then
                SendMessage($Sci, $SCI_STYLESETSIZE, $style, $size)
        EndIf
        If $font <> '' Then
                SendMessageString($Sci, $SCI_STYLESETFONT, $style, $font)
        EndIf
        SendMessage($Sci, $SCI_STYLESETBOLD, $style, $bold)
        SendMessage($Sci, $SCI_STYLESETITALIC, $style, $italic)
        SendMessage($Sci, $SCI_STYLESETUNDERLINE, $style, $underline)
EndFunc   ;==>SetStyle
Func SetProperty($Hwnd, $property, $value, $int1 = False, $int2 = False)
        Local $ret
        If $int1 And $int2 Then
                $ret = DllCall($user32, "int", "SendMessageA", "hwnd", $Hwnd, "int", $SCI_SETPROPERTY, "int", $property, "int", $value)
        ElseIf Not $int1 And Not $int2 Then
                $ret = DllCall($user32, "int", "SendMessageA", "hwnd", $Hwnd, "int", $SCI_SETPROPERTY, "str", $property, "str", $value)
        ElseIf $int1 And Not $int2 Then
                $ret = DllCall($user32, "int", "SendMessageA", "hwnd", $Hwnd, "int", $SCI_SETPROPERTY, "int", $property, "str", $value)
        ElseIf Not $int1 And $int2 Then
                $ret = DllCall($user32, "int", "SendMessageA", "hwnd", $Hwnd, "int", $SCI_SETPROPERTY, "str", $property, "int", $value)
        EndIf
        Return $ret[0]
EndFunc   ;==>SetProperty
Func WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
        #forceref $hWndGUI, $MsgID, $wParam
        Local $tagNMHDR, $event
        Local $tagNMHDR = DllStructCreate("int;int;int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int;int;int", $lParam)
        If @error Then Return
        Local $hwndFrom = DllStructGetData($tagNMHDR, 1)
        Local $idFrom = DllStructGetData($tagNMHDR, 2)
        Local $event = DllStructGetData($tagNMHDR, 3)
        Local $position = DllStructGetData($tagNMHDR, 4)
        Local $ch = DllStructGetData($tagNMHDR, 5)
        Local $modifiers = DllStructGetData($tagNMHDR, 6)
        Local $modificationType = DllStructGetData($tagNMHDR, 7)
        Local $char = DllStructGetData($tagNMHDR, 8)
        Local $length = DllStructGetData($tagNMHDR, 9)
        Local $linesAdded = DllStructGetData($tagNMHDR, 10)
        Local $message = DllStructGetData($tagNMHDR, 11)
        Local $uptr_t = DllStructGetData($tagNMHDR, 12)
        Local $sptr_t = DllStructGetData($tagNMHDR, 13)
        Local $Line = DllStructGetData($tagNMHDR, 14)
        Local $foldLevelNow = DllStructGetData($tagNMHDR, 15)
        Local $foldLevelPrev = DllStructGetData($tagNMHDR, 16)
        Local $margin = DllStructGetData($tagNMHDR, 17)
        Local $listType = DllStructGetData($tagNMHDR, 18)
        Local $X = DllStructGetData($tagNMHDR, 19)
        Local $Y = DllStructGetData($tagNMHDR, 20)
        Local $Sci = $hwndFrom
        If Not IsHWnd($Sci) Then $Sci = HWnd($Sci)
        Local $line_number = SendMessage($Sci, $SCI_LINEFROMPOSITION, $position, 0)
        ;Select
        ;Case $hwndFrom = $Sci
        ;If IsHWnd($Sci) Then
        Switch $event
                Case $SCN_CHARADDED
                        If Chr($ch) = "(" Then
                                Local $ret, $sText, $iPos = SendMessage($Sci, $SCI_GETCURRENTPOS, 0, 0), $sFuncName
                                $iLen = SendMessage($Sci, $SCI_GETCURLINE, 0, 0)
                                $sBuf = DllStructCreate("byte[" & $iLen & "]")
                                $ret = DllCall($user32, "long", "SendMessageA", "long", $Sci, "int", $SCI_GETCURLINE, "int", $iLen, "ptr", DllStructGetPtr($sBuf))
                                $current = $ret[0]
                                $startword = $current
                                While $startword > 0 And StringIsAlpha(Chr(DllStructGetData($sBuf, 1, $startword - 1)))
                                        $startword -= 1
                                        $sFuncName &= Chr(DllStructGetData($sBuf, 1, $startword))
                                WEnd
                                $sFuncName = _StringReverse($sFuncName);反转指定字符串的内容
                                $sBuf = 0
                        ElseIf Chr($ch) = "," Then
                                If SendMessage($Sci, $SCI_CALLTIPACTIVE, 0, 0) Then
                                        $hlStart = $hlEnd
                                        $iTemp = StringInStr(StringTrimLeft($sCallTip, $hlStart + 1), ",") + $hlStart
                                        If StringInStr(StringTrimLeft($sCallTip, $hlStart + 1), ")") + $hlStart < $iTemp Or $iTemp - $hlStart = 0 Then
                                                $hlEnd = StringInStr(StringTrimLeft($sCallTip, $hlStart + 1), ")") + $hlStart
                                        Else
                                                $hlEnd = $iTemp
                                        EndIf
                                        SendMessage($Sci, $SCI_CALLTIPSETHLT, $hlStart, $hlEnd)
                                EndIf
                        ElseIf Chr($ch) = ")" Then
                                If SendMessage($Sci, $SCI_CALLTIPACTIVE, 0, 0) Then SendMessage($Sci, $SCI_CALLTIPCANCEL, 0, 0)
                        ElseIf Chr($ch) = @CR Then ; if: enter is pressed / new line created
                                $CurrentLine = Sci_GetCurrentLine($Sci);获取当前行
                                $PreviousLine = Sci_GetLine($Sci, $CurrentLine - 1)
                                $TabsAdd = ""
                                $Tabs = StringSplit($PreviousLine, @TAB)

                                For $i = 1 To $Tabs[0]
                                        $TabsAdd &= @TAB
                                Next
                                Sci_AddLines($Sci, $TabsAdd, $CurrentLine)
                                $Pos = Sci_GetLineEndPos($Sci, $CurrentLine - 1)
                                Sci_SetCurrentPos($Sci, $Pos);设置当前位置
                        Else
                        EndIf
                Case $SCN_MARGINCLICK
                        SendMessage($Sci, $SCI_TOGGLEFOLD, $line_number, 0)

                Case $SCN_SAVEPOINTREACHED

                Case $SCN_SAVEPOINTLEFT

        EndSwitch
        Local $tagNMHDR = 0
        Local $event = 0
        $lParam = 0
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
Func Sci_GetCurrentLine($Sci);获取当前行
        $Pos = SendMessage($Sci, $SCI_GETCURRENTPOS, 0, 0)
        $Line = SendMessage($Sci, $SCI_LINEFROMPOSITION, $Pos, 0)
        Return $Line + 1
EndFunc   ;==>Sci_GetCurrentLine
Func Sci_SetCurrentLine($Sci, $Line);设置当前行
        SendMessage($Sci, $SCI_GOTOLINE, $Line - 1, 0)
        If @error Then
                Return 0
        Else
                Return 1
        EndIf
EndFunc   ;==>Sci_SetCurrentLine
Func Sci_GetLine($Sci, $Line)
        Local $ret, $sText
        $iLen = SendMessage($Sci, $SCI_GETLINE, $Line, 0)
        If @error Then
                Return 0
        EndIf
        $sBuf = DllStructCreate("byte[" & $iLen & "]")
        ;If @error Then
        ;        Return 0
        ;EndIf
        $ret = DllCall($user32, "long", "SendMessageA", "long", $Sci, "int", $SCI_GETLINE, "int", $Line, "ptr", DllStructGetPtr($sBuf))
        If @error Then
                Return 0
        EndIf
        $sText = BinaryToString(DllStructGetData($sBuf, 1))
        $sBuf = 0
        If @error Then
                Return 0
        Else
                Return $sText
        EndIf

EndFunc   ;==>Sci_GetLine
Func Sci_GetLineEndPos($Sci, $Line)
        Return SendMessage($Sci, $SCI_GETLINEENDPOSITION, $Line, 0)
EndFunc   ;==>Sci_GetLineEndPos
Func Sci_SetCurrentPos($Sci, $char);设置当前位置
        SendMessage($Sci, $SCI_GOTOPOS, $char, 0)
        If @error Then
                Return 0
        Else
                Return 1
        EndIf
EndFunc   ;==>Sci_SetCurrentPos

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-1-16 20:47:31 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-1-16 20:52 编辑

现在输入框失去焦点,所以需要获取焦点.
然后用 Send("^{END}")

我想写入文本到剪贴板,然后WinActivate("Au3DB"),
再Send("^v")粘贴,然后Send("^{END}")简单点.
 楼主| 发表于 2011-1-16 21:05:23 | 显示全部楼层
本帖最后由 131738 于 2011-1-16 21:07 编辑
现在输入框失去焦点,所以需要获取焦点.
然后用 Send("^{END}")

我想写入文本到剪贴板,然后WinActivate ...
lixiaolong 发表于 2011-1-16 20:47


谢谢!问题这个编辑框不同于 AUTOIT 创建函数的编辑框,设置焦点不起作用。。。。

还真不明白("^{END}")的作用,呵呵。。。我太菜了。。。。
发表于 2011-1-16 22:03:31 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-1-16 22:07 编辑

回复 3# 131738

想不到其他办法,136行
                For $i = 1 To $BText[0]
                $Text = $BText[$i]
                GUI_Event_About()
        Next
后面加
        Send("{TAB 2}")
        Send("^{END}");快速移动到文件尾

效果还好.
 楼主| 发表于 2011-1-16 22:57:18 | 显示全部楼层
回复  131738

想不到其他办法,136行
                For $i = 1 To $BText[0]
                $Text = $BText[$i] ...
lixiaolong 发表于 2011-1-16 22:03

谢谢!!!!!!!!
有效果!!!
 楼主| 发表于 2011-1-16 23:00:43 | 显示全部楼层
回复 4# lixiaolong

麻烦再请教: Send("{TAB 2}") 起什么作用?
发表于 2011-1-16 23:12:47 | 显示全部楼层
本帖最后由 lixiaolong 于 2011-1-16 23:15 编辑

回复 6# 131738

按两下"TAB"键.

按写入按钮的时候焦点在"写入按钮",这时候按一下"TAB"键,焦点到"退出按钮"
再按一下"TAB"键,焦点就到那个输入框了.
 楼主| 发表于 2011-1-16 23:33:57 | 显示全部楼层
回复  131738

按两下"TAB"键.

按写入按钮的时候焦点在"写入按钮",这时候按一下"TAB"键,焦点到"退出 ...
lixiaolong 发表于 2011-1-16 23:12


难怪我在“写入”按钮后再添加按钮就不能滚动了。。。

我在试试修改 2 这个参数看。。。。

谢谢热心解答!!!!!
 楼主| 发表于 2011-1-17 13:07:49 | 显示全部楼层
回复  131738

按两下"TAB"键.

按写入按钮的时候焦点在"写入按钮",这时候按一下"TAB"键,焦点到"退出 ...
lixiaolong 发表于 2011-1-16 23:12


在您的指点下,我将 Send("{TAB 2}") 改为 ControlFocus ( "Au3DB", "", $SciControl)

这样可避免计算 TAB 的位置和移动次数。。。。再次谢谢!!!

评分

参与人数 1金钱 +10 收起 理由
lixiaolong + 10 学习了

查看全部评分

发表于 2011-1-17 13:24:51 | 显示全部楼层
回复 9# 131738

恭喜
 楼主| 发表于 2011-1-17 15:05:08 | 显示全部楼层
[quote]回复  131738

恭喜
lixiaolong 发表于 2011-1-17 13:24 [/qu

没有您的指点,我将无法继续了,谢谢!!!
发表于 2011-1-17 16:43:16 | 显示全部楼层
在您的指点下,我将 Send("{TAB 2}") 改为 ControlFocus ( "Au3DB", "", $SciControl)

这样可避免计 ...
131738 发表于 2011-1-17 13:07



    学习了, 很好的控制 。
发表于 2011-1-23 04:38:05 | 显示全部楼层
学习学习
发表于 2011-7-22 16:15:19 | 显示全部楼层
131738     准备完善代码管理器
遇到scite窗口坐标修改不起作用
刚好从你这里借鉴一下  
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-1 21:37 , Processed in 0.082866 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表