⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convert_api_vb to autoit function.au3

📁 一个将VB下调用的API函数转换为AU3可支持的
💻 AU3
字号:
#NoTrayIcon
#include <GUIConstants.au3>
#include <Array.au3>
#include <String.au3>
#Include <GuiEdit.au3>

$Convert = GUICreate("Convert API VB to Autoit Function", 466, 358, -1, -1)
GUISetBkColor(0xB6D9FC)
$Label1 = GUICtrlCreateLabel("Visual Basic API to convert", 32, 8, 132, 17)
$Label2 = GUICtrlCreateLabel("Convet to Dll Func in Autoit", 32, 144, 133, 17)
$Edit1 = GUICtrlCreateEdit("", 16, 24, 433, 105)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x800000)
$Edit2 = GUICtrlCreateEdit("", 17, 160, 431, 121)
GUICtrlSetData(-1, "")
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x000080)
$Checkbox1 = GUICtrlCreateCheckbox("Word-wrap", 120, 288, 89, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Auto Copy", 288, 288, 81, 17)
$Button1 = GUICtrlCreateButton("&Convert", 64, 320, 75, 25, 0)
GUICtrlSetTip(-1, "Convert to autoit")
GUICtrlSetCursor (-1, 0)
$Button2 = GUICtrlCreateButton("&Paste", 200, 320, 75, 25, 0)
GUICtrlSetTip(-1, "Paste API")
GUICtrlSetCursor (-1, 0)
$Button3 = GUICtrlCreateButton("&Copy", 336, 320, 75, 25, 0)
GUICtrlSetTip(-1, "Copy Autoit Function")
GUICtrlSetCursor (-1, 0)
GUISetState (@SW_SHOW)

_GUICtrlEditGetRECT ( $Edit1 )
$About = GUICtrlCreateMenuitem ("About", GUICtrlCreateContextMenu ())

Global $String, $FuncName, $Dll, $Func, $VarNums, $i, $VarReturn, $Data, $FuncParam, $DllParam, $n

GUICtrlSetData ($Edit1, StringReplace (IniRead ("API_TO_AU.ini", "Setting", "Input", ""), "|", @CRLF))

GUICtrlSetData ($Edit2, StringReplace (IniRead ("API_TO_AU.ini", "Setting", "Output", ""), "|", @CRLF))
;Set Example
If StringInStr(GUICtrlRead($Edit1), "Fucntion") = 0 Then
    $Example = 'Declare Function WindowFromPoint Lib "user32"' & @CRLF & _
        'Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long'
    GUICtrlSetData($Edit1, $Example)
EndIf
_GUICtrlEditSetSel ($Edit1, 0, -1)
While 1
    $nMsg = GUIGetMsg ()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

    Select
        Case $nMsg = $Button1
            $String = GUICtrlRead ($Edit1)
            If $String <> "" Then
                $FuncName = _StringWordNext($String, "Function", 1)
                $Dll = StringReplace (_StringWordNext($String, "Function", 3), '"', "")
                If StringRight ($Dll, 4) <> ".dll"  then $Dll = $Dll & ".dll" 
                If StringInStr ($String, "Alias") Then
                    $Func = _StringWordNext($String, "Alias", 1)
                Else
                    $Func = $FuncName
                EndIf
                $VarReturn = ConvertType(_StringWordNext($String, "Function", -1))
                $StrExt = StringTrimLeft($String, StringInStr($String, "(") - 1)
                $AsSplit = StringRegExp($StrExt, '[ ]([Aa]s)[ ]', 3)
                If Not @error Then
                    $n = UBound($AsSplit) - 1
                    If $n > 0 Then
                        Dim $Var1[$n], $Var2[$n], $Var3[$n]
                        For $i = 0 To $n - 1
                            $Var1[$i] = StringRegExpReplace (_StringWordPrevious($StrExt, "As", 1, $i + 1), '[,)(]', "")
                            $Var2[$i] = ConvertType(StringRegExpReplace (_StringWordNext($StrExt, "As", 1, $i + 1), '[,)(]', ""))
                            $Var3[$i] = StringRegExpReplace (_StringWordPrevious($StrExt, "As", 2, $i + 1), '[,)(]', "")
                        Next
                    EndIf
                EndIf
            ;_ArrayDisplay($Var1 & $Var2 & $Var3, "fd")
                
                
            ;Glue data
                $Data = 'Func ' & $FuncName
                If $n <> 0 Then
                    If $Var3[0] = "ByRef"  Then
                        $FuncParam = "ByRef $" & $Var1[0]
                    Else
                        $FuncParam = "$" & $Var1[0]
                    EndIf
                    For $i = 1 To UBound ($Var1) - 1
                        If $Var3[$i] = "ByRef"  Then
                            $FuncParam = $FuncParam & ", ByRef $" & $Var1[$i]
                        Else
                            $FuncParam = $FuncParam & ", $" & $Var1[$i]
                        EndIf
                    Next
                    $Data = $Data & "(" & $FuncParam & ")" & @CRLF
                Else
                    $Data = $Data & "()" & @CRLF
                EndIf
                $Data = $Data & "    Global $Return" & @CRLF
                $Data = $Data & "    $Return = DllCall (" & '"' & $Dll & '", ' & '"' & $VarReturn & '", ' 
                If $n <> 0 Then
                    $Data = $Data & '"' & $Func
                Else
                    $Data = $Data & '"' & $Func & '"'
                EndIf
                If $n <> 0 Then
                    $DllParam = ""
                    For $i = 0 To UBound ($Var1) - 2
                        $DllParam = $DllParam & ', "' & $Var2[$i] & '", $' & $Var1[$i]
                    Next
                    $DllParam = $DllParam & ', "' & $Var2[UBound ($Var1) - 1] & '", $' & $Var1[UBound ($Var1) - 1] & ')' & @CRLF
                    $Data = $Data & $DllParam
                Else
                    $Data = $Data & ')' & @CRLF
                EndIf
                If $n <> 0 Then
                    If $Var2[UBound ($Var1) - 1] <> "str"  And $Var2[UBound ($Var1) - 2] = "str"  Then
                        $Data = $Data & '    Return $Return[2]' & @CRLF
                    Else
                        $Data = $Data & '    Return $Return[0]' & @CRLF
                    EndIf
                Else
                    $Data = $Data & '    Return $Return[0]' & @CRLF
                EndIf
                $Data = $Data & 'EndFunc' 
                GUICtrlSetData ($Edit2, $Data)
                IniWrite ("API_TO_AU.ini", "Setting", "Input", StringReplace ($String, @CRLF, "|"))
                IniWrite ("API_TO_AU.ini", "Setting", "Output", StringReplace ($Data, @CRLF, "|"))
            EndIf
        Case $nMsg = $Button2
            If ClipGet () <> "" Then
                GUICtrlSetData ($Edit1, ClipGet ())
            EndIf
        Case $nMsg = $Button3
            If _GUICtrlEditGetSel ($Edit1) <> 0 Then
                ClipPut(_GUICtrlEditGetSel ($Edit1))
            Else
                ClipPut (GUICtrlRead ($Edit2))
            EndIf
        Case $nMsg = $Checkbox1
            If GUICtrlRead($Checkbox1) = 1 Then
                GUICtrlSetStyle($Edit1, $ES_AUTOVSCROLL)
            Else
                GUICtrlSetStyle($Edit1, $ES_AUTOHSCROLL)
            EndIf
        Case $nMsg = $Checkbox1
            If GUICtrlRead($Checkbox1) = 1 Then
                
            Else
                
            EndIf
        Case $nMsg = $About
            MsgBox (64, "Infomation", "Author: HelloMotorola")
        EndSelect
        
WEnd

Func _StringWordNext($Phrase, $Word, $Next = 1, $PhrasePos = 1)
    If StringRight ($Phrase, 1) <> " "  Then $Phrase = $Phrase & " " 
    $WordPos = StringInStr ($Phrase, $Word, 0, $PhrasePos)
    If $WordPos <> 0 Then
        $StringSearch = StringTrimLeft ($Phrase, $WordPos - 1)
        $Array = StringRegExp ($StringSearch, "\b(.*?)[ ]", 3)
        If Not @error Then
            If $Next > 0 Then
                If $Next < UBound ($Array) Then
                    Return $Array[$Next]
                Else
                    Return ""
                EndIf
            ElseIf $Next = 0 Then
                Return UBound ($Array);Return number word Next
            Else
                If $Next = -1 Then
                    Return $Array[UBound ($Array) - 1];Return word last
                Else
                    Return ""
                EndIf
            EndIf
        Else
            Return ""
        EndIf
    Else
        Return ""
    EndIf
EndFunc  ;==>_StringWordNext


Func _StringWordPrevious($Phrase, $Word, $Previous = 1, $PhrasePos = 1)
    If StringRight ($Phrase, 1) <> " "  Then $Phrase = $Phrase & " " 
    $WordPos = StringInStr ($Phrase, $Word, 0, $PhrasePos)
    If $WordPos <> 0 Then
        $StringSearch = StringLeft ($Phrase, $WordPos - 1)
        $Array = StringRegExp ($StringSearch, "\b(.*?)[ ]", 3)
        If Not @error Then
            $ArraySize = UBound ($Array)
            If $Previous > 0 Then
                If $Previous < $ArraySize + 1 Then
                    Return $Array[$ArraySize - $Previous]
                Else
                    Return ""
                EndIf
            ElseIf $Previous = 0 Then
                Return UBound ($Array);Return number word Previous
            Else
                If $Previous = -1 Then;Return word first
                    Return $Array[0]
                Else
                    Return ""
                EndIf
            EndIf
        Else
            Return ""
        EndIf
    Else
        Return ""
    EndIf
EndFunc  ;==>_StringWordPrevious


Func ConvertType($Value)
    $TypeAu = ""
    $VBType = StringSplit ("long|RECT|OVERLAPPED|Boolean|String|Integer|any", "|"); Boolean = int
    $AutoitType = StringSplit ("int|ptr|ptr|str|str|int|ptr", "|")
    
    For $t = 1 To UBound ($VBType) - 1
        If $Value = $VBType[$t] Then
            $TypeAu = $AutoitType[$t]
            ExitLoop
        EndIf
    Next
    If $TypeAu = "" Then $TypeAu = $Value
        
    Return $TypeAu
EndFunc  ;==>ConvertType 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -