1

.txt ファイルから読み取り、.txt ファイルから読み取った文字列を分割し、分割されたばかりの文字列を保持する配列を実行し、これらを関数 send に渡すために必要な autoit 関数を開発しています。 () 現在開いているウィンドウに送信される引数として。

私の関数の名前は function keysend() なので本質的に:

  • 関数 keysend は char 値、つまり $ch を受け取ります。
  • 関数 keysend() は、カンマを区切り文字として使用した単語の文字列を含むファイルを開きます。
  • 関数 StringSplit() を介した関数 keysend() は、文字列を分割し、文字列配列を生成します。
  • case ステートメント関数 keysend() を使用して、取得した inchar 値、つまり $ch を比較し、これを 17 の異なるケースと比較し、一致するケースに基づいて、配列の特定の要素を引数として関数 Send() に渡します。

コードは上記の手順を 2 回実行しますが、関数 keysend() は 1 回だけ呼び出されるため、1 回だけ実行することを意図しています。

2 回実行される理由はありますか? コード内の唯一のループは、StringSplit によって生成された配列を実行し、各要素をメッセージ ボックスに表示することです。

以下は私のコードです

   Func keysend($ch)    ; translate the character into a keystroke and send it out

   MsgBox (0, "$ch is: ","$ch is: " & $ch)

   $file = FileOpen($filepath, 0)

   if FileExists($filepath) Then

      ; Check if file opened for reading OK
      If $file = -1 Then
          MsgBox(0, "Error", "Unable to open file.")
          Exit
      EndIf

      ; Read in lines of text until the EOF is reached
      $line = FileReadLine($file)

      MsgBox(0, "Line from file is:", $line)

      ; Split the string using the delimeter into an array
      Local $userconfigasstring = $line

      $userconfigasarray = StringSplit($userconfigasstring, ',')
      Local $userconfigasarraysize = UBound($userconfigasarray)

      MsgBox (0, "Array size: ", "Array size is: " & $userconfigasarraysize)

      If IsArray($userconfigasarray) Then 
          For $i = 0 to $userconfigasarraysize - 1  
            MsgBox (0, "$userconfigasarray", "$userconfigasarray["&$i&"] is: "&$userconfigasarray[$i])
          Next

          Switch $ch
           Case "A"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[1])
               ;$myvar = $userconfigasarray[1]
               Send("{"& $userconfigasarray[1] &"}")
               MsgBox (0, "SEND STATUS", "SEND HAS BEEN CALLED")
               ;Exit
           Case "B"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[2])
               $myvar = $userconfigasarray[2]
               ;send("{LEFT}")
               send("{"& $myvar &"}")
            Case "C"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[3])
               $myvar = $userconfigasarray[3]
               send("{"& $myvar &"}")        
           Case "D"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[4])
               $myvar = $userconfigasarray[4]
               send("{"& $myvar &"}")
           Case "E"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[5])
               $myvar = $userconfigasarray[5]
               send("{"& $myvar &"}")
           Case "F"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[6])
               $myvar = $userconfigasarray[6]
               send("{"& $myvar &"}")
               ;loggit("SEND STATUS - SEND HAS BEEN CALLED")
           Case "G"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[7])
               $myvar = $userconfigasarray[7]
               send("{"& $myvar &"}")        
           Case "H"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[8])
               $myvar = $userconfigasarray[8]
               send("{"& $myvar &"}")        
           Case "1"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[9])
               $myvar = $userconfigasarray[9]
               send("{"& $myvar &"}")        
           Case "2"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[10])
               $myvar = $userconfigasarray[10]
               send("{"& $myvar &"}")        
           Case "3"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[11])
               $myvar = $userconfigasarray[11]
               send("{"& $myvar &"}")        
           Case "4"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[12])
               $myvar = $userconfigasarray[12]
               send("{"& $myvar &"}")        
           Case "5"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[13])
               $myvar = $userconfigasarray[13]
               Send("{"& $myvar &"}")        
           Case "6"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[14])
               $myvar = $userconfigasarray[14]
               send("{"& $myvar &"}")        
           Case "7"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[15])
               $myvar = $userconfigasarray[15]
               send("{"& $myvar &"}")        
           Case "8"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[16])
               $myvar = $userconfigasarray[16]
               send("{"& $myvar &"}")        
           Case "9"
               MsgBox (0, "SWITCH STATEMENT", $userconfigasarray[17])
               $myvar = $userconfigasarray[17]
               send("{"& $myvar &"}")        
           Case Else
               MsgBox (0, "SWITCH STATEMENT", "Can't handle '" & $ch & "' <0x" & Hex(Asc($ch), 2) & ">")
               ;loggit("Can't handle '" & $ch & "' <0x" & Hex(Asc($ch), 2) & ">")

         EndSwitch

      EndIf

      FileClose($file)

      MsgBox (0, "keysend status", "END OF keysend and FileClose($file) has been closed")

      ;Exit

   Else
       MsgBox(0, "Error", "FILE DOES NOT EXIST")
       Exit  
   EndIf

EndFunc

アイデアは、バッファーに CR が含まれるまで着信ストリームのビットでいっぱいになり、CR までの部分が削除されて処理されるというものです。

以下は、関数 keysend() が呼び出されている場所です。

    While 1

    ;ManageTray()

    ;Sleep(50)  ; (to allow script to make way for other software. Not sure if it does though?)
    $inbuff = $inbuff & _Commgetstring()

    loggit("$inbuff & _Commgetstring() is: " & $inbuff)

    If @error <> 0 then loggit("Error returned by _Commgetstring()")

    ;loggit("@error is: " & @error)

    $n = StringInStr($inbuff, @CR)

    loggit("$n is: " & $n)

    if $n > 0 Then  ; found CR

        ;loggit("$n is: " & $n)

        ;$inbuff - The string to evaluate.
        ;@LF - The substring to search for or the character position to start the replacement.
        ;"" - The replacement string.

        $inbuff = StringReplace($inbuff, @LF, "")

        loggit("$inbuff using StringReplace is: " & $inbuff)

        loggit("Received i.e. StringLeft($inbuff, $n-1) " & StringLeft($inbuff, $n-1) )

        loggit("$packetID is: " & $packetID)

        ;If StringInStr($inbuff, $packetID) And StringInStr($inbuff, $remoteID) Then
        If StringInStr($inbuff, $packetID) Then

            loggit( "$inbuff in StringInStr($inbuff, $packetID) " & $inbuff)

            loggit( "StringMid($inbuff, $n-1, 1) in StringInStr($inbuff, $packetID) is: " & StringMid($inbuff, $n-1, 1))

            keysend(StringMid($inbuff, $n-1, 1) ); process the char before the CR
        EndIf

        $inbuff = StringTrimLeft($inbuff, $n)   ; inbuff holds everything after the CR

        loggit( "$inbuff after StringTrimLeft($inbuff, $n) is: " & StringTrimLeft($inbuff, $n))

    ;Else 
      ;loggit( "$n is not greater than i.e. $n is: " & $n )
    EndIf
WEnd

以下はロジットの結果です。

26-06-2013 09:09:48.723--> $inbuff & _Commgetstring() is: 
UCAST:000D6F0001B557E3,07=RFC-951

26-06-2013 09:09:48.724--> $n is: 1
26-06-2013 09:09:48.725--> $inbuff using StringReplace is: 
UCAST:000D6F0001B557E3,07=RFC-951

26-06-2013 09:09:48.726--> Received i.e. StringLeft($inbuff, $n-1) 
26-06-2013 09:09:48.727--> $packetID is: UCAST:
26-06-2013 09:09:48.729--> $inbuff in StringInStr($inbuff, $packetID) 
UCAST:000D6F0001B557E3,07=RFC-951

26-06-2013 09:09:48.730--> StringMid($inbuff, $n-1, 1) in StringInStr($inbuff, $packetID) is: 
26-06-2013 09:09:53.147--> $inbuff after StringTrimLeft($inbuff, $n) is: CAST:000D6F0001B557E3,07=RFC-951

以下に _Commgetstring() コードを投稿しました。

    ;================================================================================
;
; Function Name:  _CommGetstring()
; Description:    Get whatever characters are available received by the port for the selected channel
; Parameters:     none
; Returns:  on success the string and @error is 0
;           if input buffer empty then empty string returned
;           on failure an empty string and @error set to the error set by DllCall
; Notes: Use _CommGetLine to get a whole line treminated by @CR or a defined character.
;=================================================================================

Func _Commgetstring()
    ;get a string NB could be part of a line depending on what is in buffer
    Local $vDllAns

    If Not $fPortOpen Then
        SetError(1)
        Return 0
    EndIf

    ;$sStr1 = ''
    ;$vDllAns = DllCall($hDll,'str','GetByte')
    $vDllAns = DllCall($hDll, 'str', 'GetString')

    If @error <> 0 Then
        SetError(1)
        mgdebugCW('error in _commgetstring' & @CRLF)
        Return ''
    EndIf
    Return $vDllAns[0]
EndFunc   ;==>_Commgetstring

以下は、私の関数 loggit とそれが呼び出す関数スタンプです。

    $logfile = "file.log" ; this is a .txt file

    func stamp()    ; provide a timestamp for the log file
    return @MDAY & "-" & @MON & "-" & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & "." & @MSEC & "--> "
EndFunc

    Func loggit($logarg)
    FileWriteLine($logfile,stamp() & $logarg & @CRLF)
EndFunc

loggitの内容を示すファイルはこちら

キー送信を含むファイルはこちら

theCommgetstring() を含むファイルはこちら

助けていただければ幸いです。

4

0 に答える 0